问题描述
我不习惯使用 XML 文件,但需要从 XML 文件的各个字段中提取文本。具体来说,我已经下载并保存了如下 XML 文件:https://www.federalregister.gov/documents/full_text/xml/2007/09/18/07-4595.xml。我对这个文件和其他类似 XML 文件中标记“regtext”中的文本很感兴趣。
我已经下载了 XML 文件并将它们存储在我的计算机上,但是当我设置目录并尝试使用 readtext 包读取 XML 文件时,我收到以下错误:
regtext <- readtext("/regdata/RegDataValidation",text_field = "regtext")
Error in doc_parse_file(con,encoding = encoding,as_html = as_html,options = options) :
Start tag expected,'<' not found [4]
我试图搜索错误,但我遇到的任何事情都无法帮助我弄清楚可能发生了什么。这个基本命令对任何数量的其他文档类型(包括 .csv 或 .docx)都很有用,但由于某种原因,它似乎无法识别我在这里尝试使用的文件。任何指针都将不胜感激——我太菜了,所有关于 readtext 的文档都没有给出如何使用 XML 的示例。
根据下面的评论,我还尝试指定一个保存的 XML 文件,如下所示:
> regtext <- readtext("/regdata/RegDataValidation/0579- AC01.xml",text_field = "regtext")
Error in xml2_to_dataframe(xml) :
The xml format does not fit for the extraction without xPath
Use xPath method instead
In addition: There were 50 or more warnings (use warnings() to see the first 50)
我尝试在单个文件上指定 xPath 表达式,这并没有返回任何错误,但实际上并没有提取任何文本(即使“regtext”节点中应该有大量文本:
> regtext <- readtext("/regdata/RegDataValidation/0579- AC01.xml",text_field = "/regtext/*")
我最终得到一个具有正确 doc_id 的数据框,但没有文本。
解决方法
从错误消息来看,readtext 函数似乎正在将 xml 文件转换为纯文本文档,而 XML 包不接受它作为有效文档。
XML 解析器也可能区分“regtext”和“REGTEXT”。
这是使用 xml2 包的解决方案。 (我发现这个包提供了一个更简单的界面,更容易使用)
library(xml2)
url <- "https://www.federalregister.gov/documents/full_text/xml/2007/09/18/07-4595.xml"
page <- read_xml(url)
#parse out the nodes within the "REGTEXT" sections
regtext <- xml_find_all(page,".//REGTEXT")
#convert the regtext nodes into vector of strings
xml_text(regtext)