【问题标题】:Why rvest can't see tables为什么 rvest 看不到表格
【发布时间】:2021-05-20 17:10:50
【问题描述】:

我在尝试从某个页面抓取表格内容时遇到问题。此代码显示 5 个表

page <- read_html('https://wybory.gov.pl/sejmsenat2019/pl/kandydaci/sejm/1')
 page %>% html_nodes('table')

当指定更多时

page %>%
  html_nodes('div.con_can')
  html_nodes('table')

它掉到一张桌子上,虽然我可以看到至少有 8 个,都包裹在 div.table-responsive 中,但是在尝试列出它们时

page %>%
  html_nodes('div.table-responsive')
  html_nodes('table') %>%

我仍然返回一个表 ({xml_nodeset (1)}),它不是我感兴趣的任何可见表。

所以问题是:我如何在此页面上列出所有包含候选人姓名/职业和隶属关系的表格,和/或如何抓取它们。

【问题讨论】:

    标签: r rvest


    【解决方案1】:

    我无法回答为什么rvest 无法下载表格的问题,但使用RSelenium 包,以下应该可以工作,但需要扩展,以下载所有表格。我会使用一个循环来动态调整表格的数量并下载它,但这应该让你开始。 请确保编码正确。

    library(rvest)
    library(data.table)
    library(httr)
    library(XML)
    library(RSelenium)
    library(dplyr)
    mybrowser <- rsDriver(browser = 'firefox') 
    
    link <- "https://wybory.gov.pl/sejmsenat2019/pl/kandydaci/sejm/1"
    mybrowser$client$navigate(link)
    
    mybrowser$client$findElement(using = 'css selector', "#DataTables_Table_0")$getElementText()
    
    html.table.0 <-  mybrowser$client$findElement(using = 'css selector', "#DataTables_Table_0") 
    html.table.1 <-  mybrowser$client$findElement(using = 'css selector', "#DataTables_Table_1") 
    html.table.2 <-  mybrowser$client$findElement(using = 'css selector', "#DataTables_Table_2") 
    
    webElem5txt.0 <- html.table.0$getElementAttribute("outerHTML")[[1]]
    webElem5txt.1 <- html.table.1$getElementAttribute("outerHTML")[[1]]
    webElem5txt.2 <- html.table.2$getElementAttribute("outerHTML")[[1]]
    df.table.0 <-  read_html(webElem5txt.0) %>% html_table() %>% data.frame(.)
    df.table.1 <-  read_html(webElem5txt.1) %>% html_table() %>% data.frame(.)
    df.table.2 <-  read_html(webElem5txt.2) %>% html_table() %>% data.frame(.)
    
    mybrowser$server$stop()
    

    【讨论】:

    • 感谢您的建议@hannes101。目前看来任务比我的R技能更大。我希望有一些我不知道的简单“rvest”解决方案......
    • 你随着你的任务而成长。 ;-)
    【解决方案2】:

    您看不到它们,因为内容是从返回 blob 文件的调用中动态检索的。

    请求网址:https://wybory.gov.pl/sejmsenat2019/data/kk/sejm/1.blob

    请求方法:GET

    虽然您可以流式传输,或者实际上只是一口气抓取,但您需要处理编码(使用 python,codecs UTF-8-sig 做得足够好);然后你还需要处理表格格式的重建。

    因此,对于小型项目,这里的 selenium 可能是一个不错的选择。

    【讨论】:

    • 感谢您的解释。我什至不知道诸如 blob 文件之类的东西,并认为我错过了一些简单的 rvest 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2021-07-21
    相关资源
    最近更新 更多