web-dev-qa-db-fra.com

Belle soupe en utilisant Regex pour trouver des étiquettes?

J'aimerais vraiment pouvoir permettre à Beautiful Soup de correspondre à n'importe quelle liste de balises, comme ça. Je sais que attr accepte les regex, mais y a-t-il quelque chose dans une belle soupe qui vous permet de le faire?

soup.findAll("(a|div)")

Production:

<a> ASDFS
<div> asdfasdf
<a> asdfsdf

Mon objectif est de créer un grattoir capable de saisir des tableaux à partir de sites. Parfois, les balises sont nommées de manière incohérente, et j'aimerais pouvoir entrer une liste de balises pour nommer la partie "données" d'une table.

15
user3314418

find_all() est la méthode la plus privilégiée dans l'API de recherche Beautiful Soup.

Vous pouvez passer une variation de filtres. Passez également une liste pour trouver plusieurs balises:

>>> soup.find_all(['a', 'div']) 

Exemple :

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<html><body><div>asdfasdf</div><p><a>foo</a></p></body></html>')
>>> soup.find_all(['a', 'div'])
[<div>asdfasdf</div>, <a>foo</a>]

Ou vous pouvez utiliser un expression régulière pour rechercher des balises contenant a ou div:

>>> import re
>>> soup.find_all(re.compile("(a|div)"))
34
hwnd

Notez que vous pouvez également utiliser des expressions régulières pour rechercher dans les attributs des balises. Par exemple:

import re
from bs4 import BeautifulSoup

soup.find_all('a', {'href': re.compile(r'crummy\.com/')})

Cet exemple trouve tous les <a> tags qui pointent vers un site Web contenant la sous-chaîne 'crummy.com'.

(Je sais que c'est un très ancien article, mais j'espère que quelqu'un trouvera ces informations supplémentaires utiles.)

34
Manu CJ

oui voir les documents ...

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

import re

soup.findAll(re.compile("^a$|(div)"))
3
ZJS