【问题标题】:Simple rvest code returning empty character简单的 rvest 代码返回空字符
【发布时间】:2021-10-18 19:40:35
【问题描述】:

我正在尝试使用 Selector 小工具从 this website 上的“Printer-Friendly Minutes”链接中抓取 href。通常可以,但这次我只是用一个空字符代替我要抓取的 href。

代码如下:

url <- "http://www.richmond.ca/cityhall/council/agendas/council/2021/012521_minutes.htm"
try <- url %>% read_html %>% html_nodes(".first-child a") %>% html_attr("href") 

有人知道可能出了什么问题吗?

【问题讨论】:

  • 如果您查看页面的源代码,则没有使用类first-child。该值可能是由加载后在页面上运行的 javascript 添加的。 rvest 无法运行 javascript。确保您查看“来源”选项卡以查看 rvest 可以看到的内容,而不是“元素”选项卡。如果您需要能够运行 javascript 来获取所需的值,那么您应该考虑改用 RSelenium 之类的东西。
  • 谢谢!我不知道元素和来源之间的区别。在 Sources 选项卡中,我看到了我想要的 href (href="/__shared/assets/PFM_CNCL_01252157630.pdf" target="_blank">Printer-Friendly Minutes) - 你认为我可以吗以某种方式使用 rvest 抓住这个,还是我仍然需要使用 RSelenium?
  • @MrFlick 这类问题通常是这种情况,但这里的问题只是节点选择不正确。这一切都可以通过静态 http 方法完成。

标签: r web-scraping rvest


【解决方案1】:

由于 PFM 用作分钟的缩写,您可以通过该子字符串定位 href

library(rvest)
library(magrittr)

url <- "http://www.richmond.ca/cityhall/council/agendas/council/2021/012521_minutes.htm"

read_html(url) %>% 
  html_element('[href*=PFM]') %>% 
  html_attr('href')

您还可以使用它与前面img 标记的相邻兄弟关系,它可以通过其alt 属性值很好地定位:

read_html(url) %>%
  html_element('[alt="PDF Document"] + a') %>%
  html_attr('href')

【讨论】:

    【解决方案2】:

    我认为您只是没有正确选择节点。学习xpath真的很有帮助,它可以在html中进行精确的节点导航:

    library(rvest)
    
    domain <- "http://www.richmond.ca" 
    
    url <- paste0(domain, "/cityhall/council/agendas/council/2021/012521_minutes.htm")
    
    pdf_url <- url %>% 
             read_html %>% 
             html_nodes(xpath = "//a[@title='PFM_CNCL_012521']") %>% 
             html_attr("href") %>%
             paste0(domain, .)
    
    pdf_url
    #> [1] "http://www.richmond.ca/__shared/assets/PFM_CNCL_01252157630.pdf"
    

    我们可以通过获取结果看到这是一个有效的链接:

    httr::GET(pdf_url)
    #> Response [https://www.richmond.ca/__shared/assets/PFM_CNCL_01252157630.pdf]
    #>   Date: 2021-10-18 20:35
    #>   Status: 200
    #>   Content-Type: application/pdf
    #>   Size: 694 kB
    #> <BINARY BODY>
    

    reprex package (v2.0.0) 于 2021 年 10 月 18 日创建

    【讨论】:

    • 非常感谢!那效果很好。我曾尝试使用选择器小工具使用 xpath,但它没有给我上面的内容。你在哪里找到合适的 xpath (或者你有资源指向我 RE: learning xpath?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多