我正在尝试从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>
<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,这是我感兴趣的信息。 (并且也不确定这是否表明任何事情)。
我似乎无法绕过它,有人会有建议吗? 非常感谢你!
答案 0 :(得分:0)
为了进一步扩展,网站的HTML代码加载了一堆javascript,然后有一个模板在文档加载后填写,并且还使用查询参数作为计算的某种类型的值。我试着只读取目标javascript文件并用V8
解析它,但外部依赖性太多了。
要阅读此内容,您需要使用splashr
或seleniumPipes
之类的内容。在我写这篇文章时,我对前者很偏爱。
使用任何一种都需要运行外部程序。我不打算在这个答案中介绍如何安装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()