【问题标题】:Nokogiri seems to miss some tags... why?Nokogiri 似乎错过了一些标签……为什么?
【发布时间】:2014-11-02 14:22:02
【问题描述】:

我在以下 URL 的命令行中使用 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>

并且不一致地收集&lt;iframe&gt;标签(捕获3个中的1个):

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

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

【问题讨论】:

    标签: html ruby html-parsing nokogiri


    【解决方案1】:

    解析不熟悉的文档时首先要检查的是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 会尝试修复它们,类似于浏览器的做法,但它的知识不足以理解某些情况。这可能会导致标签丢失或放错位置。

    有问题的文档在&lt;textarea&gt; 标记内有一个嵌入的HTML 文档。那不是有效的 HTML。嵌入的文档应该已经被编码为使用实体,这样它才能正确显示,但不像真正的标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多