【问题标题】:Scraping HTML with Rvest: no text使用 Rvest 抓取 HTML:无文本
【发布时间】:2023-03-21 13:29:02
【问题描述】:

我正在尝试从 HTML 网页中抓取信息,我有直接链接,但由于某种原因无法访问相关文本。

以下是网页的两个示例:

http://151.12.58.148:8080/CPC/CPC.detail.html?A00002 http://151.12.58.148:8080/CPC/CPC.detail.html?A00003

在我阅读了 html 之后,除了相关的文本(应该从一个页面到另一个页面),我留下了所有的源代码。

例如,第一个链接给出的页面是这样的:

数据 di nascita 1872

当我在浏览器上检查时,它被编码为:

<p y:role="datasubset" y:arg="DATA_NASCITA" class="smalltitle">
     <span class="celllabel">data di nascita</span>
&nbsp;
<span y:role="multivaluedcontent" y:arg="DATA_NASCITA">1872</span>
        </p>

但是,当我用我的代码阅读它时:

link <- 'http://151.12.58.148:8080/CPC/CPC.detail.html?A00002' 
page <- read_html(link)
write.table(as.character(page), "page.txt")

我打印“页面”,检查我得到了什么,代码的相同部分是:

 <p y:role=\"datasubset\" y:arg=\"NASCITA\" class=\"smalltitle\">
     <span class=\"celllabel\">luogo di nascita</span> 
<span y:role=\"multivaluedcontent\" y:arg=\"NASCITA\"></span>
        </p>

没有 1872,这是我感兴趣的信息。 (也没有不确定这是否表明任何事情)。

我似乎无法绕过它,有人有建议吗? 非常感谢!

【问题讨论】:

  • 那是因为实际的 HTML 源代码不包含您想要的数据。它是在加载时动态创建的。

标签: html r web-scraping css-selectors rvest


【解决方案1】:

为了进一步扩展,该站点的 HTML 代码加载了一堆 javascript,然后有一个模板,该模板在文档加载后填充,并且还使用查询参数作为某种类型的计算值。我尝试只读取目标 javascript 文件并使用 V8 解析它,但外部依赖项太多。

要阅读本文,您需要使用 splashrseleniumPipes 之类的内容。我写的时候偏爱前者?。

使用任何一种都需要运行外部程序。我不会在这个答案中讨论如何安装 Splash 或 Selenium。这是您必须做的工作,但splashr 如果您对 Docker 感到满意,那么使用 Splash 会非常容易。

此位设置必要的包并启动 Splash 服务器(如果 Docker 在您的系统上可用,它将首先自动下载:

library(rvest)
library(splashr)
library(purrr)

start_splash()

下一点告诉 Splash 获取和渲染页面,然后在 javascript 完成工作后检索页面内容:

splash_local %>% 
  splash_response_body(TRUE) %>%
  splash_user_agent(ua_macos_chrome) %>%
  splash_go("http://151.12.58.148:8080/CPC/CPC.detail.html?A00002") %>%
  splash_wait(2) %>% 
  splash_html() -> pg

不幸的是,它仍然是一团糟。他们使用命名空间,在 XML 文档中很好,但在这里使用它们的方式有些问题。但是我们可以使用一些聪明的 XPath 来解决这个问题:

html_nodes(pg, "body") %>% 
  html_nodes(xpath=".//*[local-name()='h4' or local-name()='p' or local-name()='span']/text()") %>% 
  html_text(trim=TRUE) %>% 
  discard(`==`, "")
##  [1] "Abachisti Vittorio"                        "data di nascita"                           "1872"                                     
##  [4] "luogo di nascita"                          "Mirandola, Modena, Emilia Romagna, Italia" "luogo di residenza"                       
##  [7] "Mirandola, Modena, Emilia Romagna, Italia" "colore politico"                           "socialista"                               
## [10] "condizione/mestiere/professione"           "falegname"                                 "annotazioni riportate sul fascicolo"      
## [13] "radiato"                                   "Unità archivistica"                       "busta"                                    
## [16] "1"                                         "estremi cronologici"                       "1905-1942"                                
## [19] "nel fascicolo è presente"                 "scheda biografica"                         "A00002"                                   

在使用 Splash/splashr 后执行此操作以删除正在运行的 Docker 容器:

killall_splash()

【讨论】:

  • 非常感谢,我以前使用过 Selenium,但我会研究一下splash!
猜你喜欢
  • 2017-06-26
  • 2018-03-13
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多