rvest包read_html()函数停止读取“<”符号

时间:2015-10-31 03:13:06

标签: html r html-parsing rvest

我想知道rvest包中是否有意这种行为。当rvest看到<字符时,它会停止阅读HTML。

library(rvest)
read_html("<html><title>under 30 years = < 30 years <title></html>")

打印:

[1] <head>\n  <title>under 30 = </title>\n</head>

如果这是故意的,是否有解决方法?

1 个答案:

答案 0 :(得分:3)

是的,rvest是正常的,因为它对于html来说是正常的。

请参阅w3schools HTML Entities页面。 <>是html中的保留字符,其文字值必须以另一种方式编写,作为特定字符实体。这是链接页面中的实体表,给出了一些常用的html字符及其各自的html实体。

XML::readHTMLTable("http://www.w3schools.com/html/html_entities.asp", which = 2)
#    Result          Description Entity Name Entity Number
# 1           non-breaking space      &nbsp;        &#160;
# 2       <            less than        &lt;         &#60;
# 3       >         greater than        &gt;         &#62;
# 4       &            ampersand       &amp;         &#38;
# 5       ¢                 cent      &cent;        &#162;
# 6       £                pound     &pound;        &#163;
# 7       ¥                  yen       &yen;        &#165;
# 8       €                 euro      &euro;       &#8364;
# 9       ©            copyright      &copy;        &#169;
# 10      ® registered trademark       &reg;        &#174;

因此,如果不是太多,您可能必须使用gsub()或手动替换这些值。您可以看到,当这些字符被正确的实体替换时,它将正确解析。

library(XML)
doc <- htmlParse("<html><title>under 30 years = &lt; 30 years </title></html>")
xmlValue(doc["//title"][[1]])
# [1] "under 30 years = < 30 years "

您可以使用gsub(),如下所示

txt <- "<html><title>under 30 years = < 30 years </title></html>"
xmlValue(htmlParse(gsub(" < ", " &lt; ", txt, fixed = TRUE))["//title"][[1]])
# [1] "under 30 years = < 30 years "

我在这里使用了 XML 包,但这同样适用于处理html的其他包。