3

我正在尝试阅读此站点上的表格:

http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16

我使用rvest,但很快得到一个错误:

library(rvest)
read_html("http://spacefem.com/pregnant/due.php?use=EDD&m=09&d=10&y=16")

错误:名称剧透:3tbt4d3m 不符合 XML 命名空间 [202]

这个错误是什么意思,我能做些什么来解决它?

我已经查明导致错误的内部函数:xml2:::doc_parse_raw. 然而,xml2:::doc_parse_raw这只是对内部 C 代码的调用,使得调试这个问题变得更加困难。

4

2 回答 2

2

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 让我有点不安,所以也许有一种更清洁的整理方式,但在解析之前我不确定它会是什么。

于 2016-09-02T00:11:07.573 回答
2

另一种选择是使用htmltidy(需要使用 v0.3.0 或更高版本,这意味着 - 截至本答案发布之日 - 使用开发版本与 CRAN 版本,直到 CRAN 达到 0.3.0+)来“清理”文档:

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)
于 2016-09-11T13:13:06.597 回答