html - 在 R 中使用 `read_html` 使用 `rvest` 时缺少元素

标签 html r web-scraping rvest

我正在尝试使用 read_html rvest 中的函数包,但遇到了我正在努力解决的问题。

例如,如果我试图读取 this 上出现的底部表格页面,我将使用以下代码:

library(rvest)
html_content <- read_html("https://projects.fivethirtyeight.com/2016-election-forecast/washington/#now")

通过检查浏览器中的 HTML 代码,我可以看到我想要的内容包含在 <table> 中。标签(具体来说,它全部包含在 <table class="t-calc"> 中)。但是当我尝试使用以下方法提取它时:

tables <- html_nodes(html_content, xpath = '//table')

我检索了以下内容:

> tables
{xml_nodeset (4)}
[1] <table class="tippingpointroi unexpanded">\n  <tbody>\n    <tr data-state="FL" class=" "> ...
[2] <table class="tippingpointroi unexpanded">\n  <tbody>\n    <tr data-state="NV" class=" "> ...
[3] <table class="scenarios">\n  <tbody/>\n  <tr data-id="1">\n    <td class="description">El ...
[4] <table class="t-desktop t-polls">\n  <thead>\n    <tr class="th-row">\n      <th class="t ...

其中包括页面上的一些表格元素,但不是我感兴趣的。

如有任何关于我哪里出错的建议,我们将不胜感激!

最佳答案

该表是根据页面本身的 JavaScript 变量中的数据动态构建的。要么使用 RSelenium在页面呈现后抓取页面文本并将页面传递给 rvest或者使用 V8 获取所有数据的宝库:

library(rvest)
library(V8)

URL <- "http://projects.fivethirtyeight.com/2016-election-forecast/washington/#now"

pg <- read_html(URL)

js <- html_nodes(pg, xpath=".//script[contains(., 'race.model')]") %>%  html_text()

ctx <- v8()
ctx$eval(JS(js))

race <- ctx$get("race", simplifyVector=FALSE)

str(race) ## output too large to paste here

如果他们更改了 JavaScript 的格式(这是一个自动化过程,所以不太可能,但你永远不知道)那么 RSelenium如果他们不改变表结构的格式(同样,不太可能,但你永远不知道),方法会更好。

关于html - 在 R 中使用 `read_html` 使用 `rvest` 时缺少元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251047/

相关文章:

html - child 的 `height: 100%;` 没有占据 parent 的全高,为什么?

r - 使用函数从数据框中过滤或选择行的正确语法

r - 如何使用lfe包计算动态面板模型

Python - BeautifulSoup Webscrape

javascript - 在 headless 服务器云上运行的特定网站上的 Puppeteer 超时

javascript - 想知道在以下代码行中传递了什么变量(查询)

html - 使用 CSS 选择 <p> 后代

css - 在悬停跨度样式上显示 div

r - 获取边的顶点名称

java - 为什么我的程序只能获取部分网页源码?