R不接受xpath查询

时间:2014-09-01 10:36:40

标签: xml r xpath web-scraping

您好我正在使用R中的XML包来抓取HTML页面。感兴趣的页面是http://www.ncbi.nlm.nih.gov/protein/225903367?report=fasta,在该页面上有一个序列,当检查chrome中的元素时,xpath是

//*[@id="gi_225903367_141"]

但是,当我尝试使用以下内容时:

xpathSApply(htmlParse(fasta.url.content),"//*[@id="viewercontent1"]/pre")
Error: unexpected symbol in "xpathSApply(htmlParse(fasta.url.content),"//*[@id="viewercontent1"

我收到了上述错误。

XML包是否对xpath很挑剔?

这是使用Mathius提供的xpath的查询

xpathSApply(htmlParse(fasta.url.content),"//span[contains(@id,'gi_225903367_1')]")
list()
attr(,"class")
[1] "XMLNodeSet"

我得到一个空列表。我不怀疑xpath是不正确的,但我想知道这是否与R相关。

4 个答案:

答案 0 :(得分:2)

问题是页面是使用javascript动态创建的,并且在返回到R的渲染中序列不可见。

CRAN包“rentrez”提供了eutils的界面,这是查询Entrez的编程方式

library(rentrez)
entrez_fetch(db="protein", id="225903367", rettype="fasta")

答案 1 :(得分:1)

这得到了列表,虽然我不知道它是否100%正确,因为我不使用fasta文件。似乎lapply(dat, cat)可能需要在下面的dat结果中调用。

> library(RCurl)
> library(XML)
> url <- getURL("http://www.ncbi.nlm.nih.gov/protein/225903367?report=fasta")
> dat <- readHTMLList(url)
> length(dat)
# [1] 39
> object.size(dat)
# 42704 bytes

整个列表不是很大,所以我建议把整个列表放到R中。然后你就拥有了所有相关数据,而且你不必花费一整天的时间来尝试使用html文档进行正则表达式。看起来可能会触发意外符号,因为您编写了//*,并且*需要转义字符,可能是//[*]

编辑您遇到的错误是由于其他双引号内的双引号引起的。在R中应该引用"//*[@id='viewercontent1']/pre"

是的,XML可能很挑剔,但通常是因为(1)它是互联网,(2)解析器期望某些内容存在于html代码中,有时则不是。我的教授同时写了RCurlXML,他建议在RCurl::getURL或任何其他XML::readHTMLTable函数遇到问题时,对于xml文档,请转到read*

您对输出的这些问题并不奇怪。它们是一个空结果,与分配属性的函数一样。

答案 2 :(得分:0)

  

如果你去这个网址ncbi.nlm.nih.gov/protein/225903367?report=fasta   你会看到一系列以&#34; MYS&#34;开头的字母;而且就是这样   我需要的序列。

最后我想我明白了你的需要。您要查找的内容位于以下span

<span id="gi_225903367_1" class="ff_line">
    MYSFNTLRLYLWETIVFFSLAASKEAEAARSAPKPMSPSDFLDKLMGRTS…
</span>

您可以使用XPath表达式找到它:

"//span[@id = 'gi_225903367_1']"

注意:这是使用span属性值&#34; gi_225903367_1&#34;检索id元素的正确表达式。我无法评论您是否在R代码中正确应用XPath。

答案 3 :(得分:0)

@brucezepplin,我感到沮丧。 @Mathias Muller,我和你写的一起工作并运行了以下内容:

test <- "http://www.ncbi.nlm.nih.gov/protein/225903367?report=fasta" 
doc <- htmlTreeParse(test, asText = TRUE, useInternalNodes = TRUE) 
xpathSApply(doc, "//div[@id = 'viewercontent1']", xmlValue)
xpathSApply(doc, "//div[@id = 'viewercontent1']//span[@id = 'gi_225903367_1']", xmlValue)
xpathSApply(doc, "//div[@id = 'viewercontent1']/gi/span", xmlValue))

首先,当我看到&#34; doc&#34;它只显示了几个标题行,而不是整页。

但第一个xpath返回list(),所以至少它正在运行。接下来的两个返回NUL L。在所需的span节点之前有一个<pre>以及一个&gt; gi。

简而言之,这不是一个答案,但可能会让其他人更容易提供解决方案。