【问题标题】:Rvest returning empty paragraphsRvest 返回空段落
【发布时间】:2019-01-21 17:18:51
【问题描述】:

当使用 rvest 包从网页中抓取文本时,一些段落返回空,但它们不应该。

网页是: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=LEGITEXT000005620562

我想要“文章”下的段落,所以我使用“.article p”作为 CSS 选择器。它应该返回 9 个段落(5 个应该是空的,因为它们是填充物)。我确实得到了 9 个段落,但 8 个是空的!

page=read_html("https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=LEGITEXT000005620562")
html_text(html_nodes(page,".article p"))

我会发布一个截图,但我没有足够的声誉...... 运行此行会返回一个包含 9 个字符串的向量,但它们是空的,除了第 8 个。 第 1、3 和 5 段应包含文本,但此处显示为空。

感谢大家的宝贵时间。

编辑: 一点上下文:我需要从这个网站上抓取很多页面来获取文章的核心文本,然后对其进行语言分析。

“.article p”CSS 选择器在大多数页面上都表现不错,但某些段落的内容显示为空。

【问题讨论】:

  • 如果您查看该页面的源代码(从 http 请求实际返回的内容),您会发现数据确实不在 <p> 标记内。他们似乎有一堆奇怪的结束 <p/> 标签。您可以使用cat(as.character(page)) 查看源代码。所以问题真的是你的选择器不正确。请注意,如果您使用的是 Chrome,它可能会以不同于 rvest 的方式解析页面,以更宽容地处理“坏”HTML。
  • 谢谢!现在我知道为什么它不起作用了。有没有办法在 R 中获得与 chrome 中相同的解析?
  • 您可以使用RSelenium 之类的东西来运行无头版本的 Chrome。

标签: r rvest


【解决方案1】:

为什么不这样做呢?

library(tidyverse)
library(rvest)
#> Loading required package: xml2
#> 
#> Attaching package: 'rvest'
#> The following object is masked from 'package:purrr':
#> 
#>     pluck
#> The following object is masked from 'package:readr':
#> 
#>     guess_encoding


page <- read_html("https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=LEGITEXT000005620562")

page %>% 
  html_nodes(".article") %>% 
  html_text() %>% 
  str_remove_all(pattern = "\nArticle\\s[0-9]")
#> [1] " En savoir plus sur cet article...\n\n   Sont désignées comme gares ferroviaires ouvertes au trafic international au sens de l'article 35 quater de l'ordonnance du 2 novembre 1945 susvisée au titre desquelles peuvent être créées des zones d'attente les gares suivantes :\n   Lille-Europe, Lille-Flandres, Aulnoye, Strasbourg, Thionville, Forbach, Metz, Sarreguemines, Pontarlier, Morteau, Modane, Cerbère, Nice, Hendaye, Calais-Fréthun, Paris-Gare du Nord, Paris-Gare de l'Est, Paris-Gare de Lyon.\n "
#> [2] " En savoir plus sur cet article...\n\n   Le présent arrêté abroge les dispositions de l'arrêté du 4 mai 1995 désignant les gares ferroviaires ouvertes au trafic international.\n\n "                                                                                                                                                                                                                                                                                                                                
#> [3] "\nLes préfets et, à Paris, le préfet de police sont chargés, chacun en ce qui le concerne, de l'exécution du présent arrêté, qui sera publié au Journal officiel de la République française.\n\n "

reprex package (v0.2.1) 于 2019-01-21 创建

【讨论】:

  • 感谢您的快速回答,但您的解决方案仅适用于这个简单的示例。我也在处理这样的页面:legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000029337646我必须清理更多的东西
  • @RonDurand 我刚刚在那个 url 上测试了我的代码,当它只适用于第一个示例时,我不太确定你的意思。它浏览并抓取了文章下的所有段落。它可能不会产生最干净的输出,但这不是您最初的问题。
  • 我需要抓取的数据是段落的内容,在

    之间。我不想要“Article 1 En avoir plus sur cet article...”(公平地说,我们可以在之后清理它)。在第二个例子中,我不想要“Abroge Arrêté du 19 septembre...”(在第 1 条下)或“Modifié par Décret n°2016-1278 du 29 septembre 2016 - art. 1 (V)”(在第 1 条下)第 3 条)。最后还有我需要摆脱的桌子。
  • 原来的问题是“为什么有些段落在用“.article p”选择器选中时显示为空?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2019-02-13
相关资源
最近更新 更多