2016-08-02 2 views
-1

Je suis en train d'extraire tous les titres de cette mailing list lors de l'enregistrement combien de réponses chaque thread a.Scrapy ne peut pas identifier « tbody » et éléments « ul » comme indiqué par Firebug

Selon Firebug, XPath à l'<ul> qui contient tous les titres est:

/html/corps/table [2]/tbody/tr 1/td [2]/Table/tbody/tr/td/ul

Cependant, si je coller ce directement dans Scrapy Shell, il donnera une liste vide:

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') 
[] 

Après quelques essais et erreurs (depuis que je n'a pas pu comprendre de la documentation de quelque façon à la liste des sous-éléments d'un sélecteur donné immédiat (s'il vous plaît laissez-les savoir si vous connaissez un), je me suis dit que l'élément « tbody » ne fonctionne pas sur XPath. En les supprimant, j'ai pu naviguer jusqu'à /td:

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

Cependant, si je tente maintenant d'atteindre « ul » ça ne marchera pas:

email_threads.xpath('/ul') 
[] 

Maintenant, ce qui me confond le plus est que la course:

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

va me donner les années ul, mais pas dans le même ordre que celui figurant sur le site. Il saute des discussions et dans des ordres différents. En outre, il semble impossible de pouvoir compter le nombre de réponses par fil.

Qu'est-ce qui me manque ici? Cela fait un moment que je l'ai utilisé Scrapy, mais je ne me souviens pas d'être ce difficile à comprendre, et des tutoriels pour quelque raison que ce ne tirez pas soit sur Bing ou Google pour moi.

Répondre

-2

Je ne l'ai jamais utilisé Firebug, mais en regardant la page HTML que vous faites référence, je dirais que l'expression XPath suivante vous donnera toutes les discussions de haut niveau:

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

A partir de chaque élément de la liste, vous Il faut ensuite compter la quantité d'enfants listés pour obtenir le nombre de réponses à n'importe quel thread.

Utilisation du shell Scrapy, cela se traduit par:

> 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 
[...] 

En ce qui concerne votre question sur la façon de répertorier tous les sous-éléments d'un sélecteur donné, il vous suffit de réaliser que le résultat de l'exécution d'une requête XPath sur un sélecteur est un SelectorList où chaque élément de la liste implémente l'interface Selector. Vous pouvez donc simplement réutiliser XPath, par exemple. liste tous les enfants:

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

Merci. Cela semble fonctionner ici. Je vais attendre pour voir si quelqu'un connaît la réponse à la façon de la liste des sélecteurs sur Spacy ou si vous voulez basculer dans tout autre conseil, sinon je vais accepter votre réponse ici. J'ai aussi voté pour votre réponse. Savez-vous pourquoi ma question et votre réponse ont été rejetées? Il est difficile d'améliorer quand ils ne commentent pas améliorer au lieu de downvoting plaine .. –

+1

J'ai mis à jour la réponse à vous montrer comment obtenir le nombre de réponses et les enfants d'un sélecteur.En ce qui concerne le vote négatif de votre question, je ne peux que spéculer; on pourrait soutenir qu'il ne contient aucun exemple de MCV et au moins une erreur de formatage. Jetez un oeil à http://stackoverflow.com/help/how-to-ask pourrait vous aider. Mais je pense qu'il est tout simplement impoli de downvote sans donner de commentaire explicatif. – Markus

+0

Merci beaucoup. J'ai accepté votre réponse. –