J'utilise XPath
avec Scrapy
pour extraire des données d'un site de film BoxOfficeMojo.com.XPath: Sélectionner certains nœuds enfants
En général, je me demande comment sélectionner certains nœuds enfants d'un nœud parent dans une chaîne Xpath
. En fonction de la page Web de film à partir de laquelle j'écris des données, les données dont j'ai besoin se trouvent parfois sur différents nœuds enfants, par exemple s'il existe ou non un lien. Je vais parcourir environ 14 000 films, donc ce processus doit être automatisé.
En utilisant this comme exemple. J'aurai besoin d'acteur (s), de réalisateur (s) et de producteur (s).
C'est le Xpath
au directeur: Remarque:% s correspond à un indice déterminé où cette information se trouve - dans l'action Jackson exemple director
se trouve à [1]
et actors
à [2]
.
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()
Cependant, aurait un lien existe une page sur le directeur, ce serait le Xpath
:
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/a/text()
Les acteurs sont un peu plus compliqué, car il <br>
inclus pour les acteurs suivants énumérés, qui peut-être les enfants d'un /a
ou les enfants du parent /font
, donc:
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()
obtient tous les plus tous les acteurs s (sauf ceux avec font/br
).
Maintenant, le principal problème ici, je crois, est qu'il y a plusieurs //div[@class="mp_box_content"]
- tout ce que j'ai fonctionne SAUF que je finis par obtenir des chiffres d'autres mp_box_content
. J'ai également ajouté de nombreuses instructions try:
, except:
afin de tout obtenir (acteurs, réalisateurs, producteurs qui ont et n'ont pas de liens associés). Par exemple, ce qui suit est mon Scrapy
code pour les acteurs:
actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()' % (locActor,)).extract()
try:
second = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()
for n in second:
actors.append(n)
except:
actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()
Ceci est une tentative de couvrir les faits: le premier acteur peut ne pas avoir un lien associé avec lui/elle et les acteurs suivants font, le premier l'acteur peut avoir un lien associé à lui/elle mais le reste peut ne pas.
J'apprécie le temps que vous avez lu et toutes les tentatives pour m'aider à trouver/résoudre ce problème! S'il vous plaît laissez-moi savoir si d'autres informations sont nécessaires.
Wow! Merci beaucoup d'avoir pris le temps de répondre! Je suis curieux, et je vais mettre en œuvre ces choses rapidement pour voir ce qui se passe, si ces méthodes vont éliminer la question d'obtenir des informations d'autres '[@ class =" mp_box_content "]', car c'est l'un des principaux problèmes? – DMML
Vous obtiendrez uniquement le contenu de la table "The Players", et non les autres div [@ @ class = "mp_box_content"] '. J'ai corrigé 'br2nl' avec' .text' au lieu de '.tail', sinon certaines lignes ont été écrasées. Je présente également une expression XPath de compilation, de sorte que vous pouvez passer un argument 'category' en tant que variable XPath, qui représente le texte de la première cellule de la ligne que vous voulez –