2012-04-14 9 views
0

Ich habe ein HTML-Dokument zu parsen und lesen Sie eine Reihe von Sachen von dort. Das Problem ist, dass der HTML-Code mehrere Tabellen enthält, und ich bin nur an einer Tabelle interessiert. Außerdem möchte ich nur die Zeilen lesen, die einen nützlichen Inhalt haben. Hier ist eine Beispiel-HTML-Seite, es gibt zwei Tabellen ohne ID, und ich möchte nur die zweite Tabelle und nur die Zeilen, die für Menschen nützlich sind.Ruby - Nokogiri - parse nur bestimmte HTML-Tabelle

<HTML> 
<BODY> 

<TABLE> 
    <TR> 
    <TD> I don't want this table </TD></TR> 
    <TR> 
    <TD></TD> 
    <TD> No No No <br></TD> 
    </TR> 
.... 
</TABLE> 


<TABLE> 
    <TR> 
    <TD>04/13/2012 22:51 I want this table </TD></TR> 
    <TR> 
    <TD></TD> 
    <TD> First - something there <br></TD> 
    </TR> 
    <TR> 
    <TD>04/13/2012 23:23 Update from xyz</TD></TR> 
    <TR> 
    <TD></TD> 
    <TD>Second - something here <br></TD> 
    </TR> 
</TABLE> 


</BODY> 
</HTML> 

ich diesen Code bin versucht, die offensichtlich nicht funktioniert. Das o/p ist nicht der Text, den ich möchte. Es enthält beide Tabellen, ich möchte nur die zweite Tabelle. Hilfe!

require 'curb' 
require 'nokogiri' 
c = Curl::Easy.perform("http://server/cgi-bin/page.cgi?id=123456") 
html_doc = Nokogiri::HTML(c.body_str.to_s) 
puts html_doc.xpath("//table/tr/td") 
+0

Verstanden! 'require 'curb' 'nokogiri' c = Locken :: Easy.perform ("? Http: //server/cgi-bin/page.cgi id = 123456") erfordern html_doc = Nokogiri :: HTML (c.body_str.to_s) puts html_doc.xpath ("// tabelle [2]/tr/td/text()") ' –

Antwort

0

Haben Sie die XPath von //table[2]/tr/td versucht, den zweiten Tisch zu bekommen. Wenn Sie die Quelle des HTML ändern können, wäre die beste Lösung, ID-Attribute für Ihre Tabellen bereitzustellen.

+0

danke. 'html_doc.xpath (" // table [2]/tr/td/text() "' hat es funktioniert. Aber wie bekomme ich einzelne Zeile aus der Tabelle? Ich möchte dieses Zeug in mysql mit page \ r oder gehen \ n. –

+0

Wie pflege ich Zeilenumbrüche vor dem Hinzufügen zu mysql? –

+1

anstatt 'text()' aufzurufen, können Sie 'inner_html() 'auf den nokogiri-Knoten aufrufen, die Ihnen nur den rohen Text geben. Sie müssen anrufen inner_html auf jedem td-Element. – krock