您好我正在使用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相关。
答案 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代码中,有时则不是。我的教授同时写了RCurl
和XML
,他建议在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)
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。
简而言之,这不是一个答案,但可能会让其他人更容易提供解决方案。