用Rvest刮HTML:没有文字

时间:2017-10-26 01:16:07

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

我正在尝试从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,这是我感兴趣的信息。 (并且也不确定这是否表明任何事情)。

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

1 个答案:

答案 0 :(得分:0)

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

要阅读此内容,您需要使用splashrseleniumPipes之类的内容。在我写这篇文章时,我对前者很偏爱。

使用任何一种都需要运行外部程序。我不打算在这个答案中介绍如何安装Splash或Selenium。这是你必须做的腿部工作但splashr如果你对Docker感到满意的话,可以很容易地使用Splash。

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

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

start_splash()

下一位告诉Splash获取&amp;渲染页面,然后在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()