名称不符合XML命名空间

时间:2016-09-01 22:38:33

标签: r rvest xml2

我试图阅读本网站上的表格:

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代码的调用,使得对此问题的调试变得更加困难。

2 个答案:

答案 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)