我试图阅读本网站上的表格:
http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16
我使用clusplot
,但很快收到错误:
rvest
错误:名称扰乱:3tbt4d3m不符合XML命名空间[202]
这个错误是什么意思,我能做些什么来绕过它?
我已经找到导致错误的内部函数:library(rvest)
read_html("http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16")
。但是,xml2:::doc_parse_raw
只是对内部C代码的调用,使得对此问题的调试变得更加困难。
答案 0 :(得分:1)
HTML包含导致问题的格式不正确的标记,特别是<spoiler:3tbt4d3m>
,如错误所示。如果您使用httr获取HTML而不进行解析,则可以使用正则表达式删除该标记及其内容而不会发生意外,因为快速查看显示它不包含该表。
library(httr)
library(rvest)
url <- 'http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16'
html <- url %>% GET(user_agent('R')) %>% content('text')
html2 <- gsub('<spoiler:3tbt4d3m>.*</spoiler:3tbt4d3m>', '', html)
df <- html2 %>% read_html() %>%
html_node(xpath = '//table[@border="1"]') %>%
# obviously insufficient to parse double headers, but at least the data exists now
html_table(fill = TRUE)
df[1:5, 1:3]
## Date Progress Overall probability ofspontaneous labor
## 1 Date Progress On this date
## 2 Saturday August 6th, 2016 35W, 0D 0.01%
## 3 Sunday August 7th, 2016 35W, 1D 0.01%
## 4 Monday August 8th, 2016 35W, 2D 0.02%
## 5 Tuesday August 9th, 2016 35W, 3D 0.02%
混合正则表达式和HTML让我有点不安,所以也许有一种更清洁的整理方式,但在解析之前我不确定它会是什么。
答案 1 :(得分:1)
另一种选择是使用htmltidy
(需要使用v0.3.0或更高版本,这意味着 - 截至本答复之日 - 使用开发版本与CRAN版本,直到CRAN高达0.3.0+)去&#34;清洁&#34;文件:
library(rvest)
library(htmltidy) # devtools::install_github("hrbrmstr/htmltidy")
library(httr)
URL <- "http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16"
# the site was not returning content for me w/o a more browser-like user agent
res <- GET(URL, user_agent("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36"))
cleaned <- tidy_html(content(res, as="text", encoding="UTF-8"),
list(TidyDocType="html5"))
pg <- read_html(cleaned)