Nokogiri-und xpath Parsen einer HTML-Tabelle
Kann ich einrichten analysieren und eine Verbindung zu einer Website, aber, wenn ich das Skript ausführen,
es gibt eine leere Knotenmenge:
require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'ap'
time = Time.new
url = <<-EOS
'http://www.events.psu.edu/cgi-bin/cal/webevent.cgi?cmd=listday&y=%d&m=%d&d=%d&cat=&sib=1&sort=m,e,t&ws=0&cf=list&set=1&swe=1&sa=1&de=1&tf=0&sb=1&stz=Default&cal=cal299' % [time.year, time.month, time.day]
EOS
page = Nokogiri::HTML(url)
rows = page.xpath('/html/body/p/table/tbody/tr/td[3]/p/table/tbody/tr[2]')
details = rows.collect do |row|
detail = {}
[
[:time, 'td[3]/p/text()'],
[:name, 'td[4]/div/a/b/font/text()'],
[:location, 'td[4]/div[2]/text()'],
[:details, 'td[4]/div[4]/text()'],
].collect do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
ap details
Ist der zurückgegebene Wert "[]"
.
Dies ist die HTML-Datei, bevor Sie die Tabelle /html/body/p/table/tbody/tr/td[3]/p
:
<TABLE BORDER=0 CELLPADDING=3 WIDTH="100%">
<!--Begin Event-->
<TR>
<TD WIDTH="2%">
<P></P>
</TD>
<TD WIDTH="10%">
<P></P>
</TD>
<TD WIDTH="19%">
<P></P>
</TD>
<TD WIDTH="60%">
<P></P>
</TD>
</TR>
<TR>
<!--Icon Section-->
<TD CLASS="listeventbg" VALIGN=top WIDTH="2%">
<P CLASS="listeventicon"> </P>
</TD>
<!--Date Section-->
<TD CLASS="listeventbg" VALIGN=top WIDTH="10%">
<P CLASS="listeventdate">Mar 14</P>
</TD>
<!--Time Section-->
<TD CLASS="listeventbg" VALIGN=top WIDTH="19%">
<P CLASS="listeventtime">8:30 a.m. - 4:30 p.m.<BR>
</P>
</TD>
<!--Main Event Section-->
<TD CLASS="listeventbg" VALIGN=top WIDTH="60%">
<div class=listeventtitlelarge><A HREF="http://www.pennstatehershey.org/web/diabetesresearch/home">
<B><font color="#0000CC">2011 Diabetes and Obesity Research Spring Summit</FONT></B></A>
</div>
<div class=listeventtitle><B>Calendar:</B> HHD Seminars<BR>
<B>Posted by:</B> <A HREF="mailto:luk10%40psu.edu">Lauren Kipp</A><BR><B>Location:</B> The Nittany Lion Inn<BR>
</div>
<DIV CLASS="listeventspacer"> </DIV>
<DIV CLASS="listeventdetails">
<B>Details:</B><BR>Registration and Abstract Deadline: February 15, 2011<BR> <BR>Registration: Please follow the link for more details and access to on line registration. Space is limited, so please register early to ensure your seat at the conference.<BR><BR>The Keynote Speaker for this year’s event is <b>Dr. Robert Sherwin, from the Yale School of Medicine.</b> Dr. Sherwin is known for his research in the effect of insulin on brain function and immune mechanisms leading to type 1 diabetes. The topic of his presentation is <i>Pathophysiological Mechanisms in Diabetes, from Laboratory to Bedside.</i><BR><BR>A welcome to the University Park campus will be offered by <b>Eugene Marsh, MD</b>, Senior Associate Dean for the Penn State College of Medicine Regional Medical Campus and Associate Director of the Penn State Hershey Medical Group in State College<BR><BR>Abstract Submission<BR>Please follow the link for formatting details and to register your intent to submit an abstract using the on-line form.<BR> <BR>You will receive a confirmation immediately upon submission of your on-line form. Subsequently, the final formatted abstract must be sent directly to Continuing Ed by email attachment (see website instructions). Within 48 hours of sending your abstract in final format, you will receive an email confirmation from [email protected] indicating that both your form & the abstract attachment have been received.<BR><BR><i>All abstracts will be considered for poster presentations. A subset of these abstracts will be selected and invited for brief oral presentations during the “Poster Headlines” plenary sessions. To be considered for an oral presentation, please be sure to meet the submission deadline for submission of your final abstract. Prizes will be awarded for the top three posters from by post-doc/fellow/student presenters.</i>
</div>
</TD>
<!--EndEvent-->
......Followed by more of the same format
Ich versuche den Namen des Ereignisses, Zeit, Ort und die Beschreibung des Ereignisses.
- Es gibt keine
TBODY
element in Ihr nicht wohlgeformte Eingaben Probe. FAQ: Browser-add obligatorisch, (X)HTML-Elemente im DOM (wiehead
odertbody
).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine vereinfachte version, wie würde ich es angehen.
Anstatt verlassen sich auf langen XPath-Accessoren, ist es oft einfacher ist, zu brechen die Suche. Diese Schleifen über die Zeilen, dann für jede Zeile, hat eine einfache Suche für die Zellen.
Normalerweise würde ich nicht verwenden
rescue ''
aber für quick & dirty, es ist OK. Für die Produktion würde ich einrichten, echte Ausnahmebehandlung.Deinem Beispiel-code erforderlich ist, Mechanisieren, aber habe es nicht verwenden, so ich entfernt es für dieses Beispiel. Es dauerte nicht ein Weg, um Nokogiri abrufen der HTML, so fügte ich ein Open-URI.
Nokogiri erlaubt die Verwendung von CSS-und XPath-Accessoren verfügen. Eine Menge Zeiten CSS wird in eine einfachere Suche. XPath hat mehr power, aber das kann mit dem Preis der Komplexität.
/tr/td[@class="listeventbg"]/..
sucht nach Zeilen, die mit der eingebetteten Zellen, dann einen Schritt zurück, um die Zeile Ebene.ap
? Ist es eine pretty-print-Juwel? Coundn es nicht finden im Internet.Sie XPath verwenden können, anstatt die CSS-accessor-wie so:
aber, denken Sie daran, dies ist ein full-text angepasst werden, damit foobar auch gefangen werden. In jedem Fall können Sie es ändern mit ein paar einfachen regex-Funktionen oder einfach nur nicht zu ähnlichen Klassennamen. Oder, Sie könnte auch gehen mit "XPATH CSS-KLASSE MIT" aus der pivotall Jungs.
Wie es aussieht, sind Analyse über die Struktur, die anstelle der Verwendung der Klassen, die in das Dokument. Ich würde die CSS-Klassen der Ersteller des Dokuments setzen, wie diese:
Wenn Sie dies tun, in einem größeren Dokument, wo mehrere Ergebnisse zurückgegeben werden, dann verwenden Sie
css
und iterieren über die Ergebnisse stattat_css
. Letztere findet nur eine Instanz des Tags und der Klasse.Es sieht aus wie alles, was Sie wollen, ist ein Selektor, der mehr Sinn macht als der direkte Weg. Es macht es auch widerstandsfähiger zu ändern, weil, wenn Sie ändern die Struktur und halten Sie die gleichen Klassen, dann Ihre Analyse noch funktioniert.