用 Rvest 抓取 HTML:无文本

Scraping HTML with Rvest: no text

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

以下是网页的两个示例:

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

阅读完 html 后,除了相关文本(应逐页更改)外,我还剩下所有源代码。

例如,第一个 link 给出了这样的页面:

data 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")

然后我打印 "page",检查我得到了什么,代码的相同部分是:

 <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 代码加载了一堆 javascript 然后有一个模板,该模板在文档加载后填写,并将查询参数用作某种类型得到计算的价值。我试图只读入目标 javascript 文件并用 V8 解析它,但是外部依赖项太多。

要阅读本文,您需要使用 splashrseleniumPipes 之类的内容。我写的偏向于前者。

使用任何一个都需要 运行 外部程序。我不会在这个答案中讨论如何安装 Splash 或 Selenium。这是你必须做的腿部工作,但如果你对 Docker.

感到满意,splashr 可以很容易地使用 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()