【问题标题】:Extracting list of names and underlying hyperlinks from webpage using rvest使用 rvest 从网页中提取名称列表和基础超链接
【发布时间】:2021-02-15 22:24:49
【问题描述】:

我是网络抓取的新手,并试图掌握使用 rvest 从网页收集数据的方法。感兴趣的网页是https://www.cabq.gov/office-of-neighborhood-coordination/neighborhood-homeowner-coalition-websites,它提供了社区组织的列表以及指向组织网站的底层超链接。我正在尝试生成一个数据框,其中第一列是组织名称,第二列是超链接中的 URL。

我遵循了几个rvest 教程和 Stack Overflow 问题,试图解析出适当的节点以提取我感兴趣的信息,但无济于事。所需的输出将如下所示(... 只是在输出表目标的所需开头和结尾之间截断中间的输出):

| organization                                   | URL                                 |
| ---------------------------------------------- | ----------------------------------- |
| 7 Bar North Homeowners Association             | https://www.7barnorthhoa.com/       |
| Academy Acres North Neighborhood Association   | http://www.aanna.org/               |
....
| Willow Wood Neighborhood Association           | http://www.hoamcoweb.com/willowwood |
| Winrock Villas Condominium Association         | http://winrockvillas.hoaspace.com/  |

我的代码尝试如下。

library(xml2)
library(rvest)
library(tidyverse)

URL <- "https://www.cabq.gov/office-of-neighborhood-coordination/neighborhood-homeowner-coalition-websites"

pg <- read_html(URL)

html_nodes(pg, "external-link") %>% 
  map_df(function(x) {
    data_frame(
      postal = html_node(x, "span") %>% html_text(trim=TRUE),
      city = html_nodes(x, "ul > li") %>% html_text(trim=TRUE)
    )
  })  
#> # A tibble: 0 x 0

reprex package (v0.3.0) 于 2021-02-15 创建

非常感谢任何和所有帮助。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    首先,我认为您需要使用xpath 表达式来获取正确类型的链接。您对 external-link 类的 a 元素感兴趣,因此可以使用:

    html_nodes(pg, xpath="//a[@class='external-link']")
    

    您可以构建一个更复杂的 xpath 表达式来满足您的需要。然后需要提取元素的文本和一个属性,可以使用:

    html_nodes(pg, xpath="//a[@data-linktype='external' or 
     @class='external-link']") %>% 
    map_df(function(x) {
    data_frame(
      organization =  x %>% html_text(trim=TRUE),
      URL = x %>% html_attr("href")
    )})  
    

    【讨论】:

    • 这似乎很接近(谢谢!),但并没有产生所有列出的组织。似乎只有一些属于external-link 类,但其他一些属于a data-val=
    • 是的,没错,您使用 xpath 来搜索更复杂的模式:html_nodes(pg, xpath="//a[@data-linktype='external' 或 @class='external-link' ]")
    • 成功了!谢谢你,何塞!就这样我在这里得到了语法(因为我是使用 xpaths 的新手),这就是说:“对于所有包含 @data-linktype='external' 的 标记或包含 class= 的 标记'external-link' 将文本传递给组织变量,将底层 标记中的 URL 传递给 URL 变量”?我仍然不太清楚的是html_nodes() 命令中括号的功能
    • 嗨 Abe,在 xpath 中 //a 将搜索所有 &lt;a&gt; 标签,括号 [...] 用于子集或过滤,@ 用于引用标签内的属性. xpath 表达式://a[@data-linktype='external' or @class='external-link'] 将显示为:“选择所有具有属性 data-linktype 且值为 'external' 或属性 class 的 标记i> 值为“外部链接”
    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2021-03-31
    • 1970-01-01
    • 2018-11-03
    • 2019-01-19
    • 2016-05-16
    相关资源
    最近更新 更多