我正在使用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
答案 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()