2010-04-08 13 views
18

J'essaie d'extraire la méta-description pour les pages Web récupérées. Mais ici, je suis confronté au problème de la sensibilité à la casse de BeautifulSoup. Comme certaines pages ont <meta name="Description et certaines ont <meta name="description.Est-il possible que BeautifulSoup fonctionne de manière insensible à la casse?

Mon problème est très similaire à celle de Question on Stackoverflow

La seule différence est que je ne peux pas utiliser lxml .. Je dois rester avec beautifulsoup.

Répondre

8

Avec des modifications mineures cela fonctionne.

soup.findAll('meta', attrs={'name':re.compile("^description$", re.I)}) 
15

Vous pouvez donner à BeautifulSoup une expression régulière pour faire correspondre les attributs. Quelque chose comme

soup.findAll('meta', name=re.compile("^description$", re.I)) 

pourrait faire l'affaire. Cribbed de the BeautifulSoup docs.

9

Une expression régulière? Nous avons maintenant another problem.

Au lieu de cela, vous pouvez passer dans un lambda:

soup.findAll(lambda tag: tag.name.lower()=='meta', 
    name=lambda x: x and x.lower()=='description') 

(x and évite une exception lorsque l'attribut name est pas défini pour l'étiquette)

+2

+1 pour éviter l'expression rationnelle. +1 de plus pour le lien xkcd. – FlipMcF

+0

En utilisant bs4 j'obtiens "find_all() a plusieurs valeurs pour l'argument mot-clé 'nom'" avec ceci: / – Joaolvcm

3

Avec BS4 utiliser les éléments suivants:

soup.find('meta', attrs={'name': lambda x: x and x.lower()=='description'})