2010-01-17 13 views
21

Ich habe keine Dokumentation noch Tutorial dafür gefunden. Gibt es so etwas?Wie benutze ich XPath in Nokogiri?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

Der obige Code erhalten mir jede table, überall, das ein tbody Kind mit dem Attribut id gleich "threadbits_forum_251" hat. Aber warum beginnt es mit Doppel //? Warum gibt es /tr am Ende? Weitere Informationen finden Sie unter "Ruby Nokogiri Parsing HTML table II".


Kann mir jemand sagen, wie href, extrahieren id, alt, src usw. Nokogiri mit?

td[3]/div[1]/a/text()' <--- extracts text 

Wie kann ich andere Dinge extrahieren?

Antwort

41

scheint, dass Sie einen XPath Tutorial

Ihr //table/tbody[@id="threadbits_forum_251"]/tr Ausdruck bedeutet, lesen müssen:

  • // - überall in Ihrem XML-Dokument
  • table/tbody - mit einem tbody Kind ein Tabellenelement nehmen
  • [@id="threadbits_forum_251"] - wobei ID-Attribute gleich "threadbits_forum_251"
  • sind
  • tr - und nehmen ihre tr Elemente

Also, im Grunde, was Sie wissen müssen:

  • Attribute mit @
  • Bedingungen beginnt gehen innerhalb [] Klammern

Wenn ich Korrekt verstanden, dass API, können Sie mit doc.xpath("td[3]/div[1]/a")["href"] oder td[3]/div[1]/a/@href i gehen f gibt es nur ein <a> Element.

+0

@Rubens danke. Und du hast recht, ich muss das XPath Tutorial lesen. Ich dachte, es wäre nokorigi doc, das ich lesen müsste ... würdest du wissen, ob es ein Werkzeug gibt, das mir vollen Xpath geben würde, wenn ich auf die html Seite klicke? – Radek

+8

Ich weiß es nicht, aber XPath ist nicht so schwer; Betrachten Sie Ihr Dateisystem und nehmen wir an, dass jeder Ordner ein XML-Element ist; Wenn Sie also Ihren 'system32'-Ordner auswählen, erhalten Sie' \ windows \ system32' path; Ersetzen Sie einfach das '\\' 'durch'/', betrachten Sie Attribute, die mit' @ 'beginnen und Bedingungen durch' [] 'und Sie sind gut zu gehen –

+2

Ich weiß, dies ist eine ältere Antwort, aber der Link zum Xpath-Tutorial ist jetzt gebrochen. Ich denke es sollte jetzt http://www.w3schools.com/xsl/xpath_intro.asp sein – Axiombadger

6

Ihre XPath ist richtig, und Sie scheinen zu haben, Ihre eigene Frage des ersten Teils (fast) beantwortet:

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

„der Code oben erhalten mir jede Tisch Tisch tr, überall, das hat ein tbody Kind mit dem Attribut id gleich

threadbits_forum_251"

// bedeutet das folgende Element irgendwo im Dokument erscheinen.

/tr am Ende bedeutet, erhalten Sie die tr Knoten des passenden Elements.

Sie müssen nicht jedes Attribut einzeln extrahieren.Nehmen Sie einfach den gesamten Knoten alle vier Attribute in Nokogiri enthält, und die Attribute erhalten werden:

theNode['href'] 
theNode['src'] 

Wo theNode Ihr Objekt Nokogiri Node ist.


Edit:

Leider habe ich diese Bibliotheken nicht verwendet, aber ich denke, die XPath-Auswertung und Analyse von Mechanize getan wird. So erhalten Sie das gesamte Element und seine Attribute auf einmal.

doc.xpath("td[3]/div[1]/a").each do |anchor| 
    puts anchor['href'] 
    puts anchor['src'] 
    ... 
end 
+0

@Annurag danke für nette Erklärung. Ich benutze mechanisieren nicht pure nokogiri, kann ich theNode ['href'] irgendwie in [: Titel, 'td [3]/div [1]/a/text()'],? Ich möchte href anstelle von Text extrahieren – Radek

+1

'[: Adresse, 'td [3]/div [1]/a/@ href']'? –

+0

Ich suchte nach Nokogiri Tutorials und stieß auf meine eigene Antwort .. hehe :) – Anurag