用 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>
<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
解析它,但是外部依赖项太多。
要阅读本文,您需要使用 splashr
或 seleniumPipes
之类的内容。我写的偏向于前者。
使用任何一个都需要 运行 外部程序。我不会在这个答案中讨论如何安装 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()
我正在尝试从 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>
<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
解析它,但是外部依赖项太多。
要阅读本文,您需要使用 splashr
或 seleniumPipes
之类的内容。我写的偏向于前者。
使用任何一个都需要 运行 外部程序。我不会在这个答案中讨论如何安装 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()