rvest - 在 1 个标签中抓取 2 个类

Posted

技术标签:

【中文标题】rvest - 在 1 个标签中抓取 2 个类【英文标题】:rvest - scrape 2 classes in 1 tag 【发布时间】:2018-01-09 02:20:11 【问题描述】:

我是 rvest 新手。如何提取标签中有 2 个类名或只有 1 个类名的元素?

这是我的代码和问题:

doc <- paste("<html>",
             "<body>",
             "<span class='a1 b1'> text1 </span>",
             "<span class='b1'> text2 </span>",
             "</body>",
             "</html>"
            )
library(rvest)
read_html(doc) %>% html_nodes(".b1")  %>% html_text()
#output: text1, text2
#what i want: text2

#I also want to extract only elements with 2 class names
read_html(doc) %>% html_nodes(".a1 .b1") %>% html_text()
# Output that i want: text1

这是我的机器规格:

操作系统:Windows 10。

rvest 版本:0.3.2

R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

您可以按如下方式使用 css 选择器:

选择类包含b1 而不是a1

read_html(doc) %>% html_nodes(".b1:not(.a1)")
# xml_nodeset (1)
# [1] <span class="b1"> text2 </span>

或者使用属性选择器:

read_html(doc) %>% html_nodes("[class='b1']")
# xml_nodeset (1)
# [1] <span class="b1"> text2 </span>

选择类包含两者:

read_html(doc) %>% html_nodes(".a1.b1")
# xml_nodeset (1)
# [1] <span class="a1 b1"> text1 </span>

【讨论】:

谢谢!对于您的第一个解决方案,:not() 是什么?是 1 语法还是 : 可以与其他标签/类/ID 结合使用? not 字面意思。即,类不应在括号中包含类,是的,您可以将其与标签名称和 id 一起使用,例如span.b1:not(.a1)。您可以查看here 了解更多信息。

以上是关于rvest - 在 1 个标签中抓取 2 个类的主要内容,如果未能解决你的问题,请参考以下文章

使用 rvest 在 Twitter 中抓取用户视频

使用 rvest 抓取类似名称的表

使用 rvest 抓取可折叠表的问题

用rvest抓取时没有数据

Rvest 和 Google 新闻网页抓取:不起作用

使用RVest从网站抓取表格