2016-08-02 27 views
-1

Ich versuche, jeden Titel dieser mailing list zu extrahieren, während Sie registrieren, wie viele Antworten jeder Thread hat.Scrapy kann "tbody" und "ul" Elemente nicht identifizieren, wie von Firebug

Nach Firebug, die Xpath zum <ul> dass die Titel alles enthält:

/html/Körper/table [2]/tbody/tr 1/td [2]/table/tbody/tr/td/ul

Allerdings, wenn ich diese direkt in Scrapy Shell einfügen, wird es eine leere Liste ergeben:

scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
response.xpath('/html/body/table[2]/tbody/tr[1]/td[2]/table/tbody/tr/td/ul') 
[] 

Nach einigen Versuch und Irrtum (da ich Ich konnte aus der Dokumentation keine Möglichkeit heraus finden, die unmittelbaren Unterelemente eines gegebenen Selectors aufzulisten (bitte lassen Sie es wissen, wenn Sie eines kennen), ich fand heraus, dass das Element "tbody" nicht auf Xpath funktionierte. Durch diese zu entfernen, konnte ich /td navigieren:

almost_email_threads = response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td') 

Allerdings, wenn ich jetzt versuchen, zu erreichen „UL“ es wird nicht funktionieren:

email_threads.xpath('/ul') 
[] 

Nun, was verwirrt mich am meisten dass das Laufen ist:

response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td//ul') 

wird geben Sie mir die uL, aber nicht in der gleichen Reihenfolge auf der Website wie erscheinen. Es überspringt Fäden und in verschiedenen Reihenfolgen. Außerdem scheint es unmöglich zu sein, die Anzahl der Antworten pro Thread zu zählen.

Was fehlt mir hier? Es ist eine Weile her, seit ich Scrapy benutzt habe, aber ich kann mich nicht erinnern, dass es so schwierig ist, es herauszufinden, und Tutorials aus welchem ​​Grund auch immer ziehen weder auf Bing noch auf Google für mich.

Antwort

-2

Ich habe noch nie Firebug verwendet, aber auf der HTML-Seite suchen Sie verweisen, würde ich sagen, dass der folgende XPath-Ausdruck gibt Ihnen alle Top-Level-Themen:

//li[not(ancestor::li) and ./a/@name] 

aus jeder Liste Elemente starten, Sie Dann müssen Sie die Anzahl der Listen-Childs zählen, um die Anzahl der Antworten auf einen gegebenen Thread zu erhalten.

die Scrapy Shell verwenden, ergibt sich:

> scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
In [1]: threads = response.xpath('//li[not(ancestor::li) and ./a/@name]') 
In [2]: for thread in threads: 
    ...:  print thread, len(thread.xpath('descendant::li')) 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="0" href="0">Testing</a> <em'> 0 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="1" href="1">full disclosure'> 4 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="3" href="3">The Death Of TC'> 1 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="7" href="7">Re: Announcing '> 24 
[...] 

In Bezug auf Ihre Frage, wie alle Unterelemente von einem bestimmten Selektor aufzulisten, müssen Sie nur erkennen, dass das Ergebnis auf eine XPath-Abfrage des Laufens Ein Selektor ist ein SelectorList wobei jedes Listenelement die Selector Schnittstelle implementiert. Sie können XPath einfach erneut für z. Liste alle Kinder:

In [3]: thread.xpath('child::*') 
Out[3]: 
[<Selector xpath='child::*' data=u'<a name="309" href="309">it\'s all about '>, 
<Selector xpath='child::*' data=u'<em>Florin Andrei (Jul 31)</em>'>, 
<Selector xpath='child::*' data=u'<ul>\n<li><a name="313" href="313">it\'s a'>] 
+0

Vielen Dank. Es scheint hier zu funktionieren. Ich werde warten, um zu sehen, ob jemand die Antwort weiß, wie man die Selektoren auf Spacy auflistet oder einen anderen Tipp geben möchte, wenn nicht, werde ich deine Antwort hier akzeptieren. Ich habe Ihre Antwort ebenfalls hochgestuft. Weißt du, warum sowohl meine Frage als auch deine Antwort abgelehnt wurden? Es ist schwer zu verbessern, wenn sie nicht kommentieren, um zu verbessern, anstatt einfach zu downbooten. –

+1

Ich habe die Antwort aktualisiert, um Ihnen zu zeigen, wie Sie die Anzahl der Antworten und die Kinder eines Selektors erhalten.Was die Ablehnung Ihrer Frage betrifft, kann ich nur spekulieren; es könnte argumentiert werden, dass es kein MCV-Beispiel und mindestens einen Formatierungsfehler enthält. Ein Blick auf http://stackoverflow.com/help/how-to-ask könnte helfen. Aber ich denke, es ist einfach unhöflich, einen Kommentar abzugeben, ohne einen erklärenden Kommentar abzugeben. – Markus

+0

Danke schön. Ich habe deine Antwort angenommen. –