【问题标题】:With rvest, how to extract html contents from the object returned by submit_form()使用rvest,如何从submit_form()返回的对象中提取html内容
【发布时间】:2016-12-05 20:07:35
【问题描述】:

我正在尝试从 pems.dot.ca.gov 下载一些交通数据,关注 this topic

rm(list=ls())
library(rvest)
library(xml2)
library(httr)
url <- "http://pems.dot.ca.gov/?report_form=1&dnode=tmgs&content=tmg_volumes&tab=tmg_vol_ts&export=&tmg_station_id=74250&s_time_id=1369094400&s_time_id_f=05%2F21%2F2013&e_time_id=1371772740&e_time_id_f=06%2F20%2F2013&tod=all&tod_from=0&tod_to=0&dow_5=on&dow_6=on&tmg_sub_id=all&q=obs_flow&gn=hour&html.x=34&html.y=8"
pgsession <- html_session(url)
pgform <-html_form(pgsession)[[1]]
filled_form <- set_values(pgform,
                          'username' = 'omitted',
                          'password' = 'omitted')
resp = submit_form(pgsession, filled_form)
resp_2 = resp$response
cont = resp_2$content

我检查了这些项目的class(),发现resp是'session',resp_2是'response',cont是'raw'。我的问题是:如何正确提取 html 内容,以便我可以继续使用 XPath 从该页面中挑选出我想要的实际数据?我的直觉是我应该解析作为响应的 resp_2 ,但我就是无法让它工作。非常感谢您的帮助!

【问题讨论】:

  • 你看过选择器小工具吗?我发现它对于查找我想要提取的网页的特定部分很有用。 selectorgadget.com 。它适用于html_nodeshtml_text 内的rvest
  • 我刚刚查看了这个小工具,它看起来很酷。但我的问题不是关于如何从 html 中选择内容,而是关于如何将响应或原始内容转换为 html。无论如何感谢您的回答!
  • 网站似乎需要用户名和密码才能通过打开屏幕。您上面的代码使用“省略”,这不是一个有效的组合。如果您可以发布您感兴趣的实际页面的示例,那将更有帮助。
  • @Dave2e 我在我的代码中使用了我的登录凭据。我只是没有在stackoverflow中显示它们:) 抱歉让代码不可重现。我希望有人能给我关于如何处理响应或原始的提示。谢谢!

标签: html r web-scraping html-parsing rvest


【解决方案1】:

应该这样做:

pg <- content(resp$response)

html_nodes(pg, "table.inlayTable") %>% 
  html_table() -> tab

head(tab[[1]])
##                 X1      X2           X3           X4
## 1                          Data Quality Data Quality
## 2             Hour 8 Lanes   % Observed  % Estimated
## 3 05/24/2013 00:00   1,311           50            0
## 4 05/24/2013 01:00     729           50            0
## 5 05/24/2013 02:00     399           50            0
## 6 05/24/2013 03:00     487           50            0

(您显然需要修改列名)

【讨论】:

  • 这正是我需要的!谢谢@hrbrmstr,感谢您回答这个问题并获得您自己的登录凭据:)
  • 您是如何知道“table.inlayTable”设置的?真的很酷!当我谷歌这个短语时,只返回了两个结果!你知道这件事真是太棒了!
  • 我猜你需要那个页面上的表格,这就是它的 CSS 选择器。如果您要从 Web 上抓取内容,则需要阅读 CSS 选择器或 XPath 选择器并熟悉浏览器“开发者工具”
【解决方案2】:

您需要httr::content,它将响应解析为内容,在本例中是可以使用rvest 轻松解析的HTML:

resp_2 %>% content()
## {xml_document}
## <html style="height: 100%">
## [1] <head>\n  <!-- public -->\n  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/     ## ...
## [2] <body class="yui-skin-sam public">\n  <div id="maincontainer" style="height: 100%">\n\n      \n\     ## ...

【讨论】:

  • 嗨@alistaire,我想这就是我需要的。谢谢!如何将整个 部分打印到控制台以便仔细查看?
  • 如果需要,harvest::html_structure 可以让您快速查看 DOM。
  • 也可以解析为文本,使用cat打印(因为会是长单串,默认打印方式会截断):resp_2 %&gt;% content(as = 'text') %&gt;% cat()。虽然这是查看您拥有的内容的好方法,但默认解析版本更适合提取您想要的部分(尽管您可以通过在文本上调用 read_html 来恢复它)。
  • 显然,上面的第一条评论应该是rvest::html_structure。自动更正,抱歉。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多