Question

Je suis un nouvel utilisateur de python et j’ai besoin d’aide pour connaître la syntaxe à utiliser pour rechercher et itérer des balises HTML à l’aide de lxml. Voici les cas d'utilisation dont je traite:

Le fichier HTML est assez bien formé (mais pas parfait). Plusieurs tableaux à l'écran, un contenant un ensemble de résultats de recherche et un pour un en-tête et un pied de page. Chaque ligne de résultat contient un lien vers le détail du résultat de la recherche.

  1. Je dois trouver la table du milieu avec les lignes de résultat de la recherche (celle-ci j'ai été capable de comprendre):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. Je dois trouver les liens contenus dans ce tableau (c’est là que je reste bloqué):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    Il semble que les éléments de lien ne soient pas localisés.

  3. J'ai besoin du texte en clair du lien. J'imagine que ce serait quelque chose comme searchLink.text si je recevais les éléments de lien en premier lieu.

Enfin, dans la référence actuelle de l'API pour lxml, je n'ai pas pu trouver d'informations sur les appels find et findall. Je les ai extraites de morceaux de code trouvés sur Google. Me manque-t-il quelque chose sur la façon de rechercher et de parcourir efficacement les balises HTML à l'aide de lxml?

Était-ce utile?

La solution

D'accord, tout d'abord en ce qui concerne l'analyse du code HTML: si vous suivez les recommandations de zweiterlinde et S.Lott, utilisez au moins la version de beautifulsoup inclus avec lxml . De cette façon, vous bénéficierez également d’une belle interface de sélecteur xpath ou css.

Cependant, je préfère personnellement le analyseur HTML inclus dans lxml de Ian Bicking.

Deuxièmement, .find () et .findall () proviennent de lxml essayant d'être compatibles avec ElementTree, et ces deux méthodes sont décrites dans Prise en charge de XPath dans ElementTree .

Ces deux fonctions sont assez faciles à utiliser mais leur nombre XPath est très limité. Je recommande d'essayer d'utiliser la méthode xpath () complète de lxml ou, si vous êtes déjà familiarisé avec CSS, en utilisant le cssselect () méthode .

Voici quelques exemples, avec une chaîne HTML analysée comme ceci:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

En utilisant la classe de sélecteur css, votre programme ressemblerait à peu près à ceci:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

L'équivalent à l'aide de la méthode xpath serait:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

Autres conseils

Y a-t-il une raison pour laquelle vous n'utilisez pas Beautiful Soup pour ce projet? Il sera beaucoup plus facile de gérer des documents imparfaitement formés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top