web-dev-qa-db-fra.com

avertissement de l'analyseur lxml/BeautifulSoup

En utilisant Python 3, j'essaie d'analyser le mauvais HTML (qui n'est pas sous mon contrôle) en utilisant lxml avec BeautifulSoup comme expliqué ici: http://lxml.de/elementsoup.html

Plus précisément, je veux utiliser lxml, mais j’aimerais utiliser BeautifulSoup car, comme je l’ai dit, c’est un vilain HTML et lxml le rejetera tout seul.

Le lien ci-dessus indique: "Tout ce que vous avez à faire est de le transmettre à la fonction fromstring ():"

from lxml.html.soupparser import fromstring
root = fromstring(tag_soup)

Alors c'est ce que je fais:

URL = 'http://some-place-on-the-internet.com'
html_goo = requests.get(URL).text
root = fromstring(html_goo)

Il fonctionne dans le sens où je peux très bien manipuler le code HTML après cela. Mon problème est que chaque fois que je lance le script, je reçois cet avertissement gênant:

/usr/lib/python3/dist-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "html.parser")

  markup_type=markup_type))

Mon problème est peut-être évident: je n'installe pas BeautifulSoup moi-même. J'ai essayé d'ajouter le paramètre proposé à la fonction fromstring, mais cela me donne simplement l'erreur: TypeError: 'str' object is not callable. Les recherches en ligne se sont révélées infructueuses jusqu'à présent.

J'aimerais me débarrasser de ce message d'avertissement. Aide appréciée, merci d'avance.

4
Teekin

Je devais lire le code source de lxml 's et de BeautifulSoup pour comprendre cela.

Je poste ici ma propre réponse, au cas où quelqu'un d'autre en aurait besoin à l'avenir.

La fonction fromstring en question est définie ainsi:

def fromstring(data, beautifulsoup=None, makeelement=None, **bsargs):

Les arguments **bsargs finissent par être envoyés au constructeur BeautifulSoup, appelé ainsi (dans une autre fonction, _parse):

tree = beautifulsoup(source, **bsargs)

Le constructeur BeautifulSoup est défini ainsi:

def __init__(self, markup="", features=None, builder=None,
             parse_only=None, from_encoding=None, exclude_encodings=None,
             **kwargs):

Revenons maintenant à l’avertissement dans la question, qui recommande que l’argument "html.parser" soit ajouté au constructeur de BeautifulSoup. Selon cela, ce serait l'argument nommé features.

Puisque la fonction fromstring transmettra les arguments nommés au constructeur de BeautifulSoup, nous pouvons spécifier l'analyseur en nommant l'argument de la fonction fromstring, comme suit:

root = fromstring(clean, features='html.parser')

Poof. L'avertissement disparaît.

5
Teekin

Pour d'autres init comme:

soup = BeautifulSoup(html_doc)

Utilisation 

soup = BeautifulSoup(html_doc, 'html.parser')

au lieu

0
Windsooon

Lorsque vous utilisez BeautifulSoup, nous faisons toujours les choses suivantes:

[variable] = BeautifulSoup ([contenu que vous souhaitez analyser])

Voici le problème:

Si vous avez déjà installé "lxml", BeautifulSoup remarquera automatiquement qu'il l'utilisait comme praser. Ce n'est pas l'erreur, juste une notification.

Alors, comment l'enlever?

Faites juste comme ci-dessous:

[variable] = BeautifulSoup ([contenu que vous souhaitez analyser], features = "lxml" )

"Basé sur la dernière version de BeautifulSoup, 4.6.3"

Notez que différentes versions de BeautifulSoup ont différentes manières, ou que la grammaire, d’ajouter ce motif, il suffit de regarder attentivement le message d’avis.

Bonne chance!

0
Jaylin