我在以下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>
并且不一致地收集CCD_ 1标签(捕获3个标签中的1个):
@doc.xpath('//iframe').each{|n| puts n.path}
/html/body/div[3]/div[2]/div/div[2]/iframe
我想知道为什么Nokogiri只是解析所有标签,并将它们作为Nokogiri对象包含在@doc
数组中。
解析不熟悉的文档时,首先要检查的是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。嵌入的文档应该被编码为使用实体,这样它才能正确显示,但不会像真正的标记一样。