是什么使得使用rvest软件包进行桌面web清理有时会失败?

是什么使得使用rvest软件包进行桌面web清理有时会失败?,r,web-scraping,rvest,R,Web Scraping,Rvest,我在玩这个软件包,试图弄明白为什么有时候它不能刮到那些看起来像桌子的东西 例如,考虑这样一个脚本: require(rvest) url <- "http://bigcharts.marketwatch.com/quickchart/options.asp?symb=SPY" population <- url %>% xml2::read_html() %>% html_nodes(xpath='//*[@id="options"]/table/tbody/tr

我在玩这个软件包,试图弄明白为什么有时候它不能刮到那些看起来像桌子的东西

例如,考虑这样一个脚本:

require(rvest)
url <- "http://bigcharts.marketwatch.com/quickchart/options.asp?symb=SPY"
population <- url %>%
  xml2::read_html() %>%
  html_nodes(xpath='//*[@id="options"]/table/tbody/tr/td/table[2]/tbody') %>%
  html_table()
population
另一个例子:

require(rvest)
url <- "https://finance.yahoo.com/quote/SPY/options?straddle=false"
population <- url %>%
  xml2::read_html() %>%
  html_nodes(xpath='//*[@id="Col1-1-OptionContracts-Proxy"]/section/section[1]/div[2]') %>%
  html_table()
population

我想知道,如前所述,使用是强制性的,还是其他地方存在问题。

您当前的XPath实际上都没有选择表。在这两种情况下,我认为您需要将一个html表传递给html_表,因为在引擎盖下面有:

html_table.xml_node(.) : html_name(x) == "table" 
此外,长XPath太脆弱,特别是当应用一个对浏览器呈现内容有效的路径而不是rvest返回html时——因为javascript不能与rvest一起运行。就个人而言,我更喜欢漂亮的短CSS选择器。您可以使用第二快的类选择器类型,只需指定一个类

require(rvest)
url <- "http://bigcharts.marketwatch.com/quickchart/options.asp?symb=SPY"
population <- url %>%
  xml2::read_html() %>%
  html_node('.optionchain') %>%
  html_table()
再一次,我的首选是css选择器少键入

require(rvest)
url <- "https://finance.yahoo.com/quote/SPY/options?straddle=false"
population <- url %>%
  xml2::read_html() %>%
  html_node('.calls') %>%
  html_table()

你能解释一下我怎么知道我感兴趣的CSS选择器的值吗?你可以在下面编辑你的答案或回复。1学习和练习css选择器。在我的网站上有一个叫做链接的部分,我经常分享。它有一系列优秀的css选择器资源。此外,您可以右键单击某个元素上的inspect,然后右键单击copy css selector,这将为您提供一个比通常所需的路径更长的路径,但可以作为减少的起点。也有类似选择器小工具的工具——但同样,该路径通常有点冗长。从“我的链接”和其他链接中的资源全面学习css选择器是最好的。
require(rvest)
url <- "http://bigcharts.marketwatch.com/quickchart/options.asp?symb=SPY"
population <- url %>%
  xml2::read_html() %>%
  html_node(xpath='//table[2]') %>%
  html_table()
require(rvest)
url <- "https://finance.yahoo.com/quote/SPY/options?straddle=false"
population <- url %>%
  xml2::read_html() %>%
  html_node(xpath='//*[contains(@class,"calls")]') %>%
  html_table()
require(rvest)
url <- "https://finance.yahoo.com/quote/SPY/options?straddle=false"
population <- url %>%
  xml2::read_html() %>%
  html_node('.calls') %>%
  html_table()