web-dev-qa-db-fra.com

BeautifulSoup et lxml.html - que préférez-vous?

Je travaille sur un projet qui impliquera l'analyse syntaxique de HTML.

Après avoir cherché, j'ai trouvé deux options probables: BeautifulSoup et lxml.html

Y a-t-il une raison de préférer l'un à l'autre? J'ai utilisé lxml pour XML il y a quelque temps et je pense que je serai plus à l'aise avec cela, mais BeautifulSoup semble être très courant.

Je sais que je devrais utiliser celle qui fonctionne pour moi, mais je cherchais des expériences personnelles avec les deux.

33
user225312

La réponse simple, imo, est que si vous faites confiance à votre source pour être bien formée, optez pour la solution lxml. Sinon, BeautifulSoup jusqu'au bout.

Éditer:

Cette réponse a maintenant trois ans; il convient de noter, comme le fait Jonathan Vanasco dans les commentaires, que BeautifulSoup4 prend désormais en charge l'utilisation de lxml comme analyseur interne, vous pouvez donc utiliser les fonctionnalités avancées et l'interface de BeautifulSoup sans la plupart des performances, si vous le souhaitez (bien que j'atteigne directement lxml moi-même - c'est peut-être juste une force d'habitude :)).

35
simon

En résumé, lxml est positionné comme un analyseur html et xml de qualité production ultra-rapide qui, soit dit en passant, comprend également un module soupparser pour se rabattre sur les fonctionnalités de BeautifulSoup. BeautifulSoup est un projet d'une seule personne, conçu pour vous faire gagner du temps pour extraire rapidement des données de html ou xml mal formé.

documentation lxml dit que les deux analyseurs ont des avantages et des inconvénients. Pour cette raison, lxml fournit un soupparser afin que vous puissiez basculer d'avant en arrière. Citant,

BeautifulSoup utilise une approche d'analyse différente. Ce n'est pas un véritable analyseur HTML mais utilise des expressions régulières pour plonger dans la soupe de balises. Elle est donc plus indulgente dans certains cas et moins bonne dans d'autres. Il n'est pas rare que lxml/libxml2 analyse et corrige mieux le HTML cassé, mais BeautifulSoup a un support supérieur pour la détection de l'encodage. Cela dépend beaucoup de l'entrée qui fonctionne le mieux.

En fin de compte, ils disent:

L'inconvénient de l'utilisation de cet analyseur est qu'il est beaucoup plus lent que l'analyseur HTML de lxml. Donc, si les performances sont importantes, vous voudrez peut-être envisager d'utiliser soupparser uniquement comme solution de rechange dans certains cas.

Si je les comprends correctement, cela signifie que l'analyseur de soupe est plus robuste --- il peut gérer une "soupe" de balises malformées en utilisant des expressions régulières --- tandis que lxml est plus simple et analyse simplement les choses et construit un arbre comme vous vous en doutez. Je suppose que cela s'applique également à BeautifulSoup lui-même, pas seulement à soupparser pour lxml.

Ils montrent également comment bénéficier de la détection de l'encodage de BeautifulSoup, tout en analysant rapidement avec lxml:

>>> from BeautifulSoup import UnicodeDammit

>>> def decode_html(html_string):
...     converted = UnicodeDammit(html_string, isHTML=True)
...     if not converted.unicode:
...         raise UnicodeDecodeError(
...             "Failed to detect encoding, tried [%s]",
...             ', '.join(converted.triedEncodings))
...     # print converted.originalEncoding
...     return converted.unicode

>>> root = lxml.html.fromstring(decode_html(tag_soup))

(Même source: http://lxml.de/elementsoup.html ).

En mots du créateur de BeautifulSoup,

C'est tout! S'amuser! J'ai écrit Beautiful Soup pour gagner du temps à tout le monde. Une fois que vous vous y êtes habitué, vous devriez être en mesure de séparer les données de sites Web mal conçus en quelques minutes. Envoyez-moi un e-mail si vous avez des commentaires, rencontrez des problèmes ou si vous souhaitez que je connaisse votre projet utilisant Beautiful Soup.

 --Leonard

Extrait de la documentation Beautiful Soup .

J'espère que c'est maintenant clair. La soupe est un brillant projet individuel conçu pour vous faire gagner du temps pour extraire des données de sites Web mal conçus. L'objectif est de vous faire gagner du temps dès maintenant, de faire le travail, pas nécessairement de vous faire gagner du temps sur le long terme, et certainement pas d'optimiser les performances de votre logiciel.

En outre, à partir du site Web lxml ,

lxml a été téléchargé à partir de l'index de package Python plus de deux millions de fois et est également disponible directement dans de nombreuses distributions de packages, par exemple pour Linux ou MacOS-X.

Et, de Pourquoi lxml? ,

Les bibliothèques C libxml2 et libxslt présentent d'énormes avantages: ... conformes aux normes ... complètes ... rapides. vite! VITE! ... lxml est une nouvelle liaison Python pour libxml2 et libxslt ...

16
osa

Utilise les deux? lxml pour la manipulation DOM, BeautifulSoup pour l'analyse:

http://lxml.de/elementsoup.html

2
ymv

lxml est génial. Mais l'analyse de votre entrée en html n'est utile que si la structure dom vous aide réellement à trouver ce que vous recherchez.

Pouvez-vous utiliser des fonctions de chaîne ordinaires ou des expressions régulières? Pour de nombreuses tâches d'analyse HTML, traiter votre entrée comme une chaîne plutôt que comme un document HTML est, contre intuitivement, beaucoup plus facile.

0
dfichter