Nokogiri似乎错过了一些标签......为什么?

时间:2014-09-09 08:29:36

标签: html ruby html-parsing nokogiri

我在以下网址的命令行中使用Nokogiri:

nokogiri 'http://www.w3schools.com/css/tryit.asp?filename=trycss_default'

当该URL加载到irb会话中时,@ doc变量包含来自解析的HTML的Nokogiri Node对象,但是,它似乎错过了所有

<script async> 

标签,虽然它抓住了

<script> 

标记。以下是它似乎错过的异步标记:

<script async="" type="text/javascript" src="http://www.googletagservices.com/tag/js/gpt.js">    </script>
<script async="" src="//www.google-analytics.com/analytics.js"></script>
<script async="" type="text/javascript" src="http://partner.googleadservices.com/gpt/pubads_impl_48.js"></script>

并且不一致地收集<iframe>标签(抓住1个中的3个):

@doc.xpath('//iframe').each{|n| puts n.path}
/html/body/div[3]/div[2]/div/div[2]/iframe

我想知道为什么Nokogiri只是解析所有标签并将它们包含在@doc数组中作为Nokogiri对象。

1 个答案:

答案 0 :(得分:2)

解析您不熟悉的文档时要检查的第一件事是errors

>> @doc.errors
[
    [0] #<Nokogiri::XML::SyntaxError: Element script embeds close tag>,
    [1] #<Nokogiri::XML::SyntaxError: Misplaced DOCTYPE declaration>,
    [2] #<Nokogiri::XML::SyntaxError: htmlParseStartTag: misplaced <html> tag>,
    [3] #<Nokogiri::XML::SyntaxError: htmlParseStartTag: misplaced <head> tag>,
    [4] #<Nokogiri::XML::SyntaxError: htmlParseStartTag: misplaced <body> tag>
]

如果文档中存在错误,那么Nokogiri会尝试修复它们,类似于浏览器的方式,但是它的知识不足以理解某些情况。这可能导致标签丢失或错位。

相关文档在<textarea>标记内嵌有HTML文档。这不是有效的HTML。嵌入的文档应该已被编码为使用实体,因此它可以正确显示但不像真正的标记那样。