名称不符合 XML 名称空间
Name is not XML Namespace compliant
我正在尝试阅读此站点上的 table:
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")
Error: Name spoiler:3tbt4d3m is not XML Namespace compliant [202]
这个错误是什么意思,我能做些什么来解决这个问题?
我已经查明导致错误的内部函数:xml2:::doc_parse_raw
。然而,xml2:::doc_parse_raw
只是对内部 C 代码的调用,使得调试此问题变得更加困难。
HTML 包含导致问题的格式错误的标记,特别是 <spoiler:3tbt4d3m>
,如错误所示。如果你在没有解析的情况下使用 httr 获取 HTML,你可以使用正则表达式删除该标签及其内容而不会发生意外,因为快速查看会发现它不包含 table.
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 让我有点不安,所以也许有更干净的整理方式,但在解析之前我不确定它会是什么。
另一种选择是使用 htmltidy
(需要使用 v0.3.0 或更高版本,这意味着——截至本回答日期——使用开发版本与 CRAN 版本,直到 CRAN 达到 0.3.0 +) 至 "clean" 文档:
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)
我正在尝试阅读此站点上的 table:
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")
Error: Name spoiler:3tbt4d3m is not XML Namespace compliant [202]
这个错误是什么意思,我能做些什么来解决这个问题?
我已经查明导致错误的内部函数:xml2:::doc_parse_raw
。然而,xml2:::doc_parse_raw
只是对内部 C 代码的调用,使得调试此问题变得更加困难。
HTML 包含导致问题的格式错误的标记,特别是 <spoiler:3tbt4d3m>
,如错误所示。如果你在没有解析的情况下使用 httr 获取 HTML,你可以使用正则表达式删除该标签及其内容而不会发生意外,因为快速查看会发现它不包含 table.
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 让我有点不安,所以也许有更干净的整理方式,但在解析之前我不确定它会是什么。
另一种选择是使用 htmltidy
(需要使用 v0.3.0 或更高版本,这意味着——截至本回答日期——使用开发版本与 CRAN 版本,直到 CRAN 达到 0.3.0 +) 至 "clean" 文档:
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)