Nokogiri没有正确解析Delicious的导出书签html

时间:2016-09-08 04:23:10

标签: html ruby nokogiri

我似乎无法理解为什么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

1 个答案:

答案 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 &#x2013; 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个。)