python lxml et xpath - tableau html analyse
Je suis de nouveau à lxml, tout à fait nouveau pour python et ne pouvait pas trouver une solution à la suivante:
J'ai besoin d'importer quelques tables avec 3 colonnes et un nombre indéterminé de lignes commençant à la ligne 3.
Lors de la deuxième colonne de la ligne est vide, cette ligne est jeté et le traitement de la table est abandonnée.
Le code suivant imprime les données de la table fine (mais je ne suis pas en mesure de réutiliser les données par la suite):
from lxml.html import parse
def process_row(row):
for cell in row.xpath('./td'):
print cell.text_content()
yield cell.text_content()
def process_table(table):
return [process_row(row) for row in table.xpath('./tr')]
doc = parse(url).getroot()
tbl = doc.xpath("/html//table[2]")[0]
data = process_table(tbl)
Ce n'imprime que la première colonne 🙁
for i in data:
print i.next()
Seulement les éléments suivants à l'importation sur la troisième ligne, et pas ultérieures
tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0]
Personne ne sait d'une fantaisie solution pour obtenir toutes les données à partir de la ligne 3 dans la ville et le copier dans un tableau donc il peut être traité dans un module sans lxml dépendance?
Merci d'avance pour votre aide, Alex
document source est disponible ici (uniquement entre 06h00 et 22h00 heure de paris): tinyurl.com/yj4corh
résultat attendu: [['Premier', '05', 'nom1'], [u'Deuxi\xe8me', '13', 'nom2']]
OriginalL'auteur user191131 | 2009-10-16
Vous devez vous connecter pour publier un commentaire.
C'est un générateur:
Vous appelez-la comme si vous pensiez qu'il renvoie une liste. Il n'a pas. Il y a des contextes dans lesquels il se comporte comme une liste:
mais c'est seulement parce que d'un générateur et d'une liste à la fois d'exposer la même interface pour
for
boucles. L'utiliser dans un contexte où il est évalué qu'une seule fois, par exemple:appelle simplement une nouvelle instance de la génératrice une fois pour chaque nouvelle valeur de
row
, en retournant le premier résultat donné.Donc, c'est votre premier problème. Votre deuxième est que vous attendez:
pour vous donner la troisième et toutes les lignes suivantes, et c'est seulement
tbl
à la troisième rangée. Ainsi, l'appel àxpath
est retour de la troisième et toutes les lignes suivantes. C'est le[0]
à la fin c'est la pagaille.Je ne crois pas que le simple fait de retirer la
[0]
à partir de la fin de cette déclaration, qui a causé l'erreur. Vous avez changé quelque chose d'autre, ou que l'erreur est levée plus tard.Pardonnez cette pauvre âme, je dois admettre que mon python compétences sont très probablement impliqué... Voici le code extrait m'énerve: pastebin.com/m522b6970
OriginalL'auteur Robert Rossney
Vous avez besoin d'utiliser une boucle pour accéder à la ligne de données, comme ceci:
Appel à next() une fois que vous avez accès seulement le premier élément, c'est pourquoi vous voyez l'une colonne.
Noter qu'en raison de la nature de groupes électrogènes, vous ne pouvez accéder qu'une seule fois. Si vous avez modifié l'appel
process_row(row)
enlist(process_row(row))
, le générateur serait converti en une liste qui peut être réutilisé.Mise à jour: Si vous avez juste besoin de la 3ème ligne et sur, utiliser
data[2:]
Il n'est pas clair pour moi pourquoi vous avez besoin de la deuxième xpath, voir la mise à jour de ma réponse.
J'ai besoin de tout le contenu de la table à partir de la ligne 3, et la seconde xpath seulement retourne une seule ligne. Bien sûr, j'ai fait ce que vous avez suggéré dans votre mise à jour, mais je suis curieux de savoir quel est le problème avec la deuxième xpath, comme il le ferait à mon code pour les jours suivants cleaner
OriginalL'auteur interjay