【问题标题】:rvest: how to find required css-selectorrvest:如何找到所需的 CSS 选择器
【发布时间】: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 个。

标签: r web-scraping css-selectors rvest


【解决方案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 的好习惯,但仍然:非常感谢您深入研究它!
  • 不客气。这让我发疯了。
  • 干得好!这是一个简单的修复。了解未来的好技巧。
猜你喜欢
  • 1970-01-01
  • 2020-01-04
  • 2016-04-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多