gpt4 book ai didi

json - httr GET 函数读取表

转载 作者:行者123 更新时间:2023-12-02 01:19:47 26 4
gpt4 key购买 nike

我想抓取这个website , 并从表中获取数据。

我使用httr包中的GET,代码如下:

url <- 'http://datacenter.mep.gov.cn/report/water/water.jsp?'
year <- 2016
wissue <- 2

res <- GET(url,
query = list(year = year,
wissue = wissue))


resC <- content(res, as = 'text', encoding = 'utf-8')

但我得到的不是 json 字符串,而是一些非常奇怪的东西,如下所示:

"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<html>\r\n\t<head>\r\n\t\t<title>中华人民共和国环境保护部--政府网站数据中心</title>\r\n\t\t<meta http-equiv=\"content-type\" content=\"text/html;

我想知道有没有办法解析这种格式?

最佳答案

rowspan属性将使处理此表变得非常有趣。您有几个选择,其中两个是:

  1. 使用html_table()在目标上 <table>使用 fill=TRUE并对结果数据框进行手术
  2. <tr> 处攻击它-level 并从头开始构建数据框架

这个答案是后者。

library(rvest)
library(purrr)

首先,我们以可以对其执行 XML/HTML 手术的形式获取内容:

content(res, as = 'text', encoding = 'utf-8') %>% 
read_html() -> pg

接下来,我们定位并提取带有报告的表节点:

tab <- html_nodes(pg, "table#report1") 

这是一个棘手的问题。我们首先针对所有 <tr>具有 @rowspan 的元素属性但没有 <td>带有 @colspan 的元素属性:

html_nodes(tab, xpath=".//tr[td[not(@colspan) and @rowspan]]") %>% 

接下来,我们逐个处理它们:

  map_df(function(x) {

我们得到行数 <tr>跨度:

    html_nodes(x, xpath=".//td[@rowspan]") %>% 
html_attr("rowspan") %>%
as.numeric() -> row_ct

找到所有兄弟<tr>元素并将集合减少到此 <tr> 中的剩余元素“ block ”:

    rows <- html_nodes(x, xpath=".//following-sibling::tr")
rows <- rows[1:(row_ct-1)]

从第一个 block 行制作一个数据框

    html_nodes(x, xpath=".//td") %>% 
html_text() %>%
setNames(sprintf("X%d", 1:13)) %>%
as.list() %>%
flatten_df() -> first

遍历所有已过滤的同级行并执行相同的操作,留出空间来填充跨越的列:

    map_df(rows, ~html_nodes(., xpath=".//td") %>% 
html_text() %>%
setNames(c("X1", "X2", sprintf("X%d", 4:13))) %>%
as.list()) %>%
mutate(X3=first$X3) %>%
select(X1, X2, X3, everything()) -> rest

bind_rows(first, rest)

}) -> h2o_df

dplyr::glimpse(h2o_df)

我无法粘贴它的输出,因为 SO 的 javascript 文本过滤器太脑残了,它认为帖子是垃圾邮件,因为它有汉字字符。

这是一个连续 block 中的所有代码:

tab <- html_nodes(pg, "table#report1") 

html_nodes(tab, xpath=".//tr[td[not(@colspan) and @rowspan]]") %>%
map_df(function(x) {

html_nodes(x, xpath=".//td[@rowspan]") %>%
html_attr("rowspan") %>%
as.numeric() -> row_ct

rows <- html_nodes(x, xpath=".//following-sibling::tr")
rows <- rows[1:(row_ct-1)]

html_nodes(x, xpath=".//td") %>%
html_text() %>%
setNames(sprintf("X%d", 1:13)) %>%
as.list() %>%
flatten_df() -> first

map_df(rows, ~html_nodes(., xpath=".//td") %>%
html_text() %>%
setNames(c("X1", "X2", sprintf("X%d", 4:13))) %>%
as.list()) %>%
mutate(X3=first$X3) %>%
select(X1, X2, X3, everything()) -> rest

bind_rows(first, rest)

}) -> h2o_df

关于json - httr GET 函数读取表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40759002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com