2016-09-08 27 views
0

我似乎無法確定爲什麼Nokogori沒有正確解析這個html文件。此html文件是從Delicious導出的書籤。它有400個鏈接,但始終只分析254個鏈接。我有其他可口的html導出文件,它們只能找到254個鏈接(鏈接數量不同),並且正確解析鏈接(超過2000個鏈接),所以看起來好像可能存在導致問題的特定鏈接,但我真的不確定。我在這裏鏈接到html,因爲html將這篇文章的正文放在了字符限制之內。這是HTML的一個例子(實際HTML有超過400個標籤):Nokogiri不能正確解析導出的書籤html

<!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寶石的HTML文件,並解析它。我一直在使用這個代碼是(其中html_upload是使用Carrierwave模型實例):

doc = Nokogiri::HTML.parse html_upload.file.read 
puts doc.css('a').count 
+0

歡迎堆棧溢出。請閱讀「[mcve]」。您需要最小輸入(HTML)_在問題本身_以及預期輸出。不要指望我們離開現場去追蹤這些信息或爲了減少這些信息;相反,幫助我們幫助你。鏈接腐爛然後中斷,當他們做你的問題對我們或任何其他尋找類似解決方案的人來說沒有任何意義。 –

+0

我試過了,但遇到了字符限制,當時我認爲html的長度與答案有關。 – TenJack

+1

既然你知道這不是真的,那麼解決這個問題是很好的,因爲它符合指導原則。 –

回答

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)

+0

謝謝!這是一個偉大的領先。我最終使用了'巨大'的解析選項:doc = Nokogiri :: HTML(data)do | config | config.huge end這個答案也有幫助:http://stackoverflow.com/questions/37542491/parsing-large-html-files-with-nokogiri/37542948 – TenJack

+0

很高興你找到了答案。我會把它放在這裏讓其他人更容易找到。請注意,你可以用較少的輸入來實現:'doc = Nokogiri.HTML(myhtml,&:huge)' – Phrogz

+0

是的,計劃選擇是作爲答案和upvoting。最後一個意見是,問題實際上並不是沒有太多未封閉的標籤(每個書籤導出由於某種原因都使用未封閉的

標籤),而是因爲它看起來在一個標籤內有太多嵌套標籤(限制似乎是256 )。 – TenJack