【问题标题】:What makes table web scraping with rvest package sometimes fail?是什么导致使用 rvest 包抓取表格网页有时会失败?
【发布时间】:2019-11-25 06:13:57
【问题描述】:

我正在使用 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 解释的那样——或者问题是否出在其他地方。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案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()
    

    【讨论】:

    • 您能否解释一下我如何知道我感兴趣的 CSS 选择器的值?您可以在下方编辑您的答案或回复。
    • 1) 学习和练习 CSS 选择器。在我的SO profile page 上有一个我经常分享的链接部分。那有一个很好的 CSS 选择器资源的选择。此外,您可以右键单击元素上的检查,然后右键单击复制 css 选择器 - 这通常会为您提供比所需路径更长的路径,但可以用作减少的起点。还有诸如选择器小工具之类的工具-但同样,该路径通常有点冗长。最好从我的链接和其他资源中的资源中学习 CSS 选择器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2019-02-17
    • 2017-04-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多