使用rvest解决字段的两种方法有什么区别

时间:2017-03-01 23:46:16

标签: r xpath rvest

我对rvest的问题很快。 这两个电话之间有什么区别?

library(rvest)
document <- read_html('http://www.wikidata.org')

链式XPath

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

整个XPath

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"

为什么它在我过滤的节点之外寻找?

仅仅是我的错误理解或某些页面问题或某些库错误?

1 个答案:

答案 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()