我似乎无法理解为什么Nokogori没有正确解析这个html文件。这个html文件是来自Delicious的书签导出。它有400个链接,但总是只解析254个链接。我有其他Delicious html导出文件,它们也只找到254个链接(具有不同的链接数量)和一个正确解析链接(超过2000个链接),因此好像可能存在导致问题的特定链接,但是我真的不确定。我在这里链接到html,因为html将此帖的正文放在字符限制上。这是html的一个例子(实际的html有超过400个标签):
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<!-- This is an automatically generated file.
It will be read and overwritten.
Do Not Edit! -->
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><A HREF="http://www.lecartelclothing.com/" ADD_DATE="1459226337" PRIVATE="1" TAGS="montreal,art,design">Le Cartel | Le Cartel Clothing Inc.</A>
<DT><A HREF="http://parkdaleprojectread.org/" ADD_DATE="1459226204" PRIVATE="1" TAGS="ngo">Parkdale Project Read</A>
<DT><A HREF="http://darkmp3.ru/" ADD_DATE="1458608207" PRIVATE="1" TAGS="music,blogs,music_blog,download">Dark mp3</A>
<DT><A HREF="http://www.sbs.com.au/programs/the-family-law/article/family-law-episode-guide" ADD_DATE="1458603937" PRIVATE="1" TAGS="asian,china,cinema">The Family Law: Watch the series | Programs</A>
<DT><A HREF="http://asiansdoingeverything.tumblr.com/" ADD_DATE="1458602744" PRIVATE="1" TAGS="asian,blogs,china">Asians Doing Everything</A>
</DL></p>
我使用Carrierwave gem上传html文件并解析它。这段代码我一直在使用(其中html_upload是使用Carrierwave的模型实例):
doc = Nokogiri::HTML.parse html_upload.file.read
puts doc.css('a').count
答案 0 :(得分:2)
当Nokogiri没有像您期望的那样解析文档时,请务必检查doc.errors
。
这是我尝试解析您的要点中的原始内容时得到的结果:
require 'nokogiri'
doc = Nokogiri.HTML(DATA.read)
puts doc.errors.last
#=> Excessive depth in document: 256 use XML_PARSE_HUGE option
这里的问题是HTML文件有大量未封闭的标签(大多数是<DT>
,Nokogiri(或者更确切地说,libxml2)试图在另一个内嵌套。图解:
doc = Nokogiri.XML(html,&:noblanks)
puts doc.to_xhtml(indent:2)
#=> <TITLE>Bookmarks</TITLE>
#=> <H1>Bookmarks</H1>
#=> <DL>
#=> <p>
#=> <DT>
#=> <A HREF="http://boomjacak.com/" ...>BOOM JACAK</A>
#=> <DT>
#=> <A HREF="http://tropicaliainfursnyc.com/" ...>Tropicalia in Furs Baby!</A>
#=> <DT>
#=> <A HREF="https://uptimerobot.com/" ...>Uptime Robot</A>
#=> <DT>
#=> <A HREF="http://yagphotovoice.tumblr.com/" ...>EYE SPY</A>
#=> <DT>
#=> <A HREF="http://glitterbeat.com/" ...>Glitterbeat – Vibrant Global Sounds</A>
#=> <DT>
#=> <A HREF="http://www.puzz.com/stickelsframegames.html" ...>Stickels Frame Games</A>
#=> <DT>
#=> <A HREF="http://silentdiscosquad.com/" ...>Silent Disco Squad</A>
#=> <DT>
#=> <A HREF="http://innerfire.ca/" ...>None</A>
#=> <DT>
#=> <A HREF="http://lidopepper.tumblr.com/" ...>Lido Pimienta - La Papessa</A>
#=> <DT>
#=> <A HREF="http://cabaretdiaspora.wordpress.com/" ...>Radio Cabaret Diaspora | Musiques urbaines</A>
#=> <DT>
你可以告诉Nokogiri使用'huge' config option:
doc = Nokogiri.HTML( myhtml, &:huge )
我个人只是使用gsub
轻轻修复相关HTML:
html = DATA.read
html.gsub! /<DT>.+?<\/A>$/, '\\0</DT>'
doc = Nokogiri.HTML(html)
p doc.css('a').length
#=> 399
(我查了一下:文件中只有399个链接,而不是400个。)