Teste si un atsortingbut est présent dans une balise dans BeautifulSoup

Je voudrais obtenir toutes les balises dans un document, puis traiter chacune d’elles en fonction de la présence (ou de l’absence) de certains atsortingbuts.

Par exemple, pour chaque , si l’atsortingbut for est présent, faites quelque chose; sinon, si la bar atsortingbuts est présente, faites autre chose.

Voici ce que je fais actuellement:

 outputDoc = BeautifulSoup(''.join(output)) scriptTags = outputDoc.findAll('script', attrs = {'for' : True}) 

Mais de cette façon, je filtre toutes les balises avec l’atsortingbut for … mais j’ai perdu les autres (celles sans l’atsortingbut for ).

Si je comprends bien, vous souhaitez simplement toutes les balises de script, puis vérifiez qu’elles contiennent certains atsortingbuts?

 scriptTags = outputDoc.findAll('script') for script in scriptTags: if script.has_attr('some_atsortingbute'): do_something() 

Pour référence future, has_key est obsolète, c’est beautifulsoup 4. Maintenant, vous devez utiliser has_attr

 scriptTags = outputDoc.findAll('script') for script in scriptTags: if script.has_attr('some_atsortingbute'): do_something() 

Vous n’avez pas besoin de lambda pour filtrer par atsortingbut, vous devez simplement définir src=True etc.:

 soup = bs4.BeautifulSoup(html) # Find all with a specific atsortingbute tags = soup.find_all(src=True) tags = soup.select("[src]") # Find all meta with either name or http-equiv atsortingbute. soup.select("meta[name],meta[http-equiv]") # find any tags with any name or source atsortingbute. soup.select("[name], [src]") # find first/any script with a src atsortingbute. tag = soup.find('script', src=True) tag = soup.select_one("script[src]") # find all tags with a name atsortingbute beginning with foo # or any src beginning with /path soup.select("[name^=foo], [src^=/path]") # find all tags with a name atsortingbute that contains foo # or any src containing with whatever soup.select("[name*=foo], [src*=whatever]") # find all tags with a name atsortingbute that endwith foo # or any src that ends with whatever soup.select("[name$=foo], [src$=whatever]") 

Vous pouvez également utiliser re avec find / find_all etc.:

 import re # starting with soup.find_all("script", src=re.comstack("^whatever")) # contains soup.find_all("script", src=re.comstack("whatever")) # ends with soup.find_all("script", src=re.comstack("whatever$")) 

Si vous avez seulement besoin d’obtenir des balises avec des atsortingbuts, vous pouvez utiliser lambda:

 soup = bs4.BeautifulSoup(YOUR_CONTENT) 
  • Tags avec atsortingbut
 tags = soup.find_all(lambda tag: 'src' in tag.attrs) 

OU

 tags = soup.find_all(lambda tag: tag.has_attr('src')) 
  • Balise spécifique avec atsortingbut
 tag = soup.find(lambda tag: tag.name == 'script' and 'src' in tag.attrs) 
  • Etc …

Je pensais que cela pourrait être utile.

En utilisant le module pprint, vous pouvez examiner le contenu d’un élément.

 from pprint import pprint pprint(vars(element)) 

Utiliser ceci sur un élément bs4 imprimera quelque chose de similaire à ceci:

 {'attrs': {u'class': [u'pie-productname', u'size-3', u'name', u'global-name']}, 'can_be_empty_element': False, 'contents': [u'\n\t\t\t\tNESNA\n\t'], 'hidden': False, 'name': u'span', 'namespace': None, 'next_element': u'\n\t\t\t\tNESNA\n\t', 'next_sibling': u'\n', 'parent': 

\nBedside table\n\n\t\t\t\tNESNA\n\t\n

, 'parser_class': , 'prefix': None, 'previous_element': u'\n', 'previous_sibling': u'\n'}

Pour accéder à un atsortingbut – disons la liste de classes – utilisez ce qui suit:

 class_list = element.attrs.get('class', []) 

Vous pouvez filtrer les éléments en utilisant cette approche:

 for script in soup.find_all('script'): if script.attrs.get('for'): # ... Has 'for' attr elif "myClass" in script.attrs.get('class', []): # ... Has class "myClass" else: # ... Do something else 

vous pouvez vérifier si certains atsortingbuts sont présents

 scriptTags = outputDoc.findAll ('script', some_atsortingbute = True)
 pour le script dans les balises script:
     faire quelque chose()