2016-09-08 2 views
0

Nokogori가이 html 파일을 올바르게 구문 분석하지 않는 이유를 알 수 없습니다. 이 html 파일은 Delicious에서 북마크 내보내기입니다. 그것에는 400 개의 링크가 있지만 항상 오직 254 개의 링크만을 파싱합니다. 나는 다른 Delicious html 내보내기 파일을 가지고 있는데, 링크가 다른 254 개의 링크와 2000 개의 링크를 올바르게 파싱하는 링크가 있으므로 문제를 일으키는 특정 링크가있는 것처럼 보입니다. 나는 정말로 확신하지 못한다. html이 글자 수 제한을 초과하는이 글의 본문을 표시하기 때문에 여기 html로 연결됩니다. 이것은 (실제 HTML은 400 개 이상의 태그가) html로의 예입니다 : 나는 Carrierwave 보석과 HTML 파일을 업로드하고 분석하고 있습니다Nokogiri가 Delicious에서 내 보낸 북마크 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> 

. 노코 기리가 예상대로 문서를 구문 분석하지 않는 경우

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

에 오신 것을 환영합니다 스택 오버플로. "[mcve]"를 읽으십시오. 예상 출력과 함께 질문 자체에 최소 입력 (HTML) _이 필요합니다. 해당 정보를 추적하거나 귀하의 정보를 줄이기 위해 오프 사이트에 갈 것을 기대하지 마십시오. 우리가 대신 당신을 도울 수 있습니다. 링크 썩은 다음 휴식, 그리고 그들이 당신의 질문을 할 때 우리 또는 다른 사람에게 비슷한 솔루션을 찾고 이해가되지 않습니다. –

+0

나는 시도했지만 글자 수 한도를 치고 있었고 당시 html의 길이는 대답과 관련이 있다고 생각했습니다. – TenJack

+1

그것이 사실이 아니라는 것을 알고 있기 때문에 질문을 수정하여 지침을 충족시키는 것이 좋을 것입니다. –

답변

2

항상 doc.errors을 확인하십시오 (html_upload이 Carrierwave를 사용하여 모델의 인스턴스 인 경우에) 내가 사용하고이 코드입니다.

여기 나는 당신의 요지를 원시의 콘텐츠를 구문 분석 할 때 내가 무엇을 얻을 :

require 'nokogiri' 
doc = Nokogiri.HTML(DATA.read) 
puts doc.errors.last 
#=> Excessive depth in document: 256 use XML_PARSE_HUGE option 

여기서 문제는 HTML 파일이있는 노코 기리 (또는 오히려, 대부분 <DT> 닫히지 않은 태그의 톤을 (가지고 있다는 것입니다, . libxml2를가) 하나에 둥지를 시도하는 또 다른 일러스트 :

당신은 'huge' config option 사용하여 위조 노코 기리 말할 수
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> 

:

나는 개인적으로 그냥 가볍게 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