Nokogiri 没有正确解析从 Delicious 导出的书签 html
Nokogiri not parsing exported bookmark html from Delicious correctly
我似乎不明白为什么 Nokogori 没有正确解析这个 html 文件。此 html 文件是从 Delicious 导出的书签。它有 400 links,但总是只解析出 254 links。我还有其他 Delicious html 导出文件,它们也只能找到 254 links(具有不同的 link 数量)和一个正确解析 links 的文件(超过 2000 links),所以似乎可能有特定的 links 导致了这个问题,但我真的不确定。我要 link 转到 html 这里,因为 html 使这个 post 的正文超出了字符限制。这是 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
当 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个。)
我似乎不明白为什么 Nokogori 没有正确解析这个 html 文件。此 html 文件是从 Delicious 导出的书签。它有 400 links,但总是只解析出 254 links。我还有其他 Delicious html 导出文件,它们也只能找到 254 links(具有不同的 link 数量)和一个正确解析 links 的文件(超过 2000 links),所以似乎可能有特定的 links 导致了这个问题,但我真的不确定。我要 link 转到 html 这里,因为 html 使这个 post 的正文超出了字符限制。这是 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
当 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 = DATA.read
html.gsub! /<DT>.+?<\/A>$/, '\0</DT>'
doc = Nokogiri.HTML(html)
p doc.css('a').length
#=> 399
(我查了一下:文件里只有399个链接,没有400个。)