我在以下网址的命令行中使用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对象。
答案 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。嵌入的文档应该已被编码为使用实体,因此它可以正确显示但不像真正的标记那样。