【问题标题】:R - rvest (webscraping) with unclosed xml nodes, here: problem with html_nodes("br")R - 带有未关闭的 xml 节点的 rvest (webscraping),这里:html_nodes("br") 的问题
【发布时间】:2021-01-06 14:12:19
【问题描述】:

我使用 rvest 提取网页的一部分(EDITthis webpage),代码如下:

library('rvest')
webpage <- read_html(url("https://www.tandfonline.com/action/journalInformation?show=editorialBoard&journalCode=ceas20"))
people <- webpage %>%
  html_nodes(xpath='//*[@id="8af55cbd-03a5-4deb-9086-061d8da288d1"]/div/div/div') %>%
  html_nodes(xpath='//p')

结果存储在一个名为people的xml_nodeset中:

> people
{xml_nodeset (11)}
 [1] <p> <b>Editors:</b> <br> Dr Xyz Anceschi - <i>University of Glasgow <a href="http://www.gla.ac.uk/schools/soci ...
 [2] <p> <b>Editorial Board:</b> <br> Dr Xyz Aliyev - <i>University of Glasgow</i> <br> Professor Richard Berry < ...
 [3] <p> <b>Board of Management:</b> <br> Professor Xyz Berry (Chair) <i>- University of Glasgow</i> <br> Profes ...
 [4] <p> <b>National Advisory Board:</b> <br> Dr Xyz Badcock <i>- University of Nottingham</i> <br> Professor Cath ...

people 中,每个元素都包含关注&lt;br&gt; 的各种人名(但未封闭:没有&lt;/br&gt;)。

我试图用这段代码解析每个人,但它不起作用:

sapply(people,
    function(x)
    {
        x %>%
        html_nodes("br") %>%
        html_text()
    }
)

它只给了我一个空结果列表:

[[1]]
 [1] "" ""

[[2]]
 [1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

[[3]]
 [1] "" "" "" "" ""

[[4]]
 [1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

我认为错误是基于 &lt;br&gt; 是 xml_nodeset 中的未关闭节点这一事实。会不会是这样?

如果是这样,我还能做些什么来从people 中提取每个人吗?

【问题讨论】:

  • 请添加您要从其中抓取数据的链接。您想从链接中提取哪些数据?
  • 除了链接和预期结果之外,你用什么代码获取people节点列表?
  • 谢谢@RonakShah 和 xwhitelight,我相应地编辑了原始帖子。

标签: r xml web-scraping rvest node-set


【解决方案1】:

您可以使用str_match_all 获取出现在&lt;br&gt;&lt;i&gt; 之间的所有名称。

unlist(sapply(stringr::str_match_all(people, '<br> (.*?)\\s?-?\\s<i>'), 
              function(x) x[, 2]))

# [1] "Dr Luca Anceschi"                "Professor David J. Smith"       
# [3] "Dr Huseyn Aliyev"                "Professor Richard Berry"        
# [5] "Dr Maud Bracke"                  "Dr Eamonn Butler"               
# [7] "Dr Ammon Cheskin"                "Dr Sai Ding"                    
# [9] "Professor Jane Duckett"          "Professor Rick Fawn"  
#...
#...

【讨论】:

  • 太完美了。非常感谢(也感谢正确的正则表达式)!只是想知道:function(x) x[, 2] 在这里做什么?
  • str_match_all 返回一个包含 2 列的矩阵。第一个使用pattern 中定义的完整字符串,第二个使用捕获组。通过使用x[, 2],我们只返回捕获组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2017-07-03
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多