我对rvest
的问题很快。
这两个电话之间有什么区别?
library(rvest)
document <- read_html('http://www.wikidata.org')
content <- document %>%
html_nodes(xpath = "/html/body/div[3]/div[3]/div[4]/div[1]")
string <- document %>%
html_node(xpath = "//div[3]/div/div/div") %>%
html_text()
> string
# [1] "\n\n\n\n\nWelcome to Wikidata\nthe free knowledge base with
# 25,268,822 data items that anyone can edit\nIntroduction
string<- document %>%
html_nodes(xpath = "/html/body/div[3]/div[3]/div[4]/div[1]/div[3]/div/div/div") %>%
html_text()
> string
# [1] " Learn about data"
他们会返回不同的结果,而我认为他们应该返回相同的结果。
这第一个是错的。我已经通过该页面上的firebug检查了XPATH:
"/html/body/div[3]/div[3]/div[4]/div[1]/div[3]/div/div/div"
为什么它在我过滤的节点之外寻找?
仅仅是我的错误理解或某些页面问题或某些库错误?
答案 0 :(得分:3)
html_nodes
帮助页面实际上是这样说的:
XPath选择器---------------------------------------------
用XPath链接有点棘手 - 你可能需要改变 你正在使用的前缀 - //总是从根目录中选择 无论您目前在文档中的哪个位置
因此,如果您在管道后使用//
,搜索将忽略它的位置并在树中找到任何div/span[3]
。
您想使用:
content <- document %>%
html_nodes(xpath = "/html/body/div[3]/div[3]/div[4]/div[1]")
string <- content %>%
html_node(xpath = "div[3]/div/div/div") %>%
html_text()
在&#39;过滤器之后没有初始//
。
这与
相同string<- document %>%
html_nodes(xpath = "/html/body/div[3]/div[3]/div[4]/div[1]/div[3]/div/div/div") %>%
html_text()