rvest:如何找到所需的 CSS 选择器

Posted

技术标签:

【中文标题】rvest:如何找到所需的 CSS 选择器【英文标题】:rvest: how to find required css-selector 【发布时间】:2021-06-16 07:38:29 【问题描述】:

我正在尝试使用 rvest抓取在议会举行的部分演讲。 使用 css 选择器或 chrome 的检查器工具为我提供了一个选择器,但是我无法检索预期的(任何)数据。 AFAIK,该站点也不是基于 java 等的,即不需要 RSelenium 等。

这里是link:

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

session_1 <- "https://www.parlament.gv.at/PAKT/VHG/XXVII/NRSITZ/NRSITZ_00001/fnameorig_796482.html"

x <- session_1 %>%  
  rvest::read_html() %>% 
  rvest::html_element("wordsection14") %>% 
  rvest::html_text()

最终,我希望能够使用类 'wordsection*' 获取所有元素中包含的文本。

非常感谢任何提示。非常感谢。

【问题讨论】:

由于您正在寻找 class=Wordsection14 而不是 html 标签,因此您需要使用“。”在类名之前,但这仍然无法解决。 我不明白这个页面发生了什么。 page %&gt;% html_elements("div") 应该返回一个完整的节点列表(所有的 WordSection),但在这种情况下它只返回前 5 个。 【参考方案1】:

tl;dr 问题不在于 CSS 选择器。就是编码。指定编码 = 'latin1'

read_html('https://www.parlament.gv.at/PAKT/VHG/XXVII/NRSITZ/NRSITZ_00001/fnameorig_796482.html', encoding = "latin1") %>% 
  html_nodes('[class^=WordSection]') %>%
  html_text() %>% 
  length()

卷曲:

你也可以使用 curl。

library(rvest)
library(curl)

text_info <- curl_fetch_memory("https://www.parlament.gv.at/PAKT/VHG/XXVII/NRSITZ/NRSITZ_00001/fnameorig_796482.html") %>%
  rawToChar(.$content) %>%
  .[[1]] %>%
  read_html() %>%
  html_nodes("[class^=WordSection]") %>%
  html_text()

CSS 选择器:

如果您使用以运算符 ^ 开头的 css 属性 = 值选择器来获取类值以 WordSection 开头的所有节点。

鉴于存在大量嵌套以避免重复材料,您可能会决定使用nth-child range 选择器或other css selector combinations 来限制匹配列表。

编写一些自定义函数来管理字符串清理。

如果您愿意,当然可以使用不同的 css 选择器。


【讨论】:

@Dave2e 仍然没有缩小原因,而是劫持了 java,因为我注意到它适用于某些 java 实现并返回预期的 69。开始阅读实现细节但尚未解决。跨度> 这是编码。在测试编码时我没有早点选择它的原因是我假设 R 使用了latin-1,但它是latin1。最令人沮丧。 @QHarr 我知道这不是 SO 的好习惯,但仍然:非常感谢您深入研究它! 不客气。这让我发疯了。 干得好!这是一个简单的修复。了解未来的好技巧。

以上是关于rvest:如何找到所需的 CSS 选择器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“选择器小工具”将数据抓取到 R 中?

从 jquery ajax 成功数据中获取 css this 和 value 选择器

Jquery4 过滤选择器

相当于Android视图的CSS类选择器?

jQuery 选择器 复习

您如何根据偏好创建开始时间和结束时间选择器?