是什么使带有rvest软件包的表格网页抓取有时失败?

时间:2019-07-16 13:30:18

标签: r web-scraping rvest

我正在使用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/td/table[2]/tbody') %>%
  html_table()
population

如果我检查population,则为空列表:

> population
list()

另一个例子:

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

我想知道是否强制使用PhantomJS(如here所述),或者问题是否出在其他地方。

1 个答案:

答案 0 :(得分:1)

您当前的两个xpath都不选择表。在这两种情况下,我都认为您需要将html表传递给html_table,因为在幕后有以下内容:

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

由于源中的“合并”单元格,表格当然需要清理,但是您知道了。

使用xpath您可以:

require(rvest)
url <- "http://bigcharts.marketwatch.com/quickchart/options.asp?symb=SPY"
population <- url %>%
  xml2::read_html() %>%
  html_node(xpath='//table[2]') %>%
  html_table()

注意:我减少了xpath并使用代表一个表的单个节点。


第二秒钟:

同样,您的xpath没有选择表格元素。表类是多值的,但是在xpath中,即//*[contains(@class,"calls")],一个正确选择的类就足够了。选择一个表节点。

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

再一次,我更喜欢使用CSS选择器(输入更少!)

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