Проверьте, присутствует ли атрибут в теге в BeautifulSoup

Я хотел бы получить все теги <script> в документе, а затем обработать каждый из них на основе наличия (или отсутствия) определенных атрибутов.

Например, для каждого <script> , если атрибут присутствует, что-то делает; иначе, если bar атрибутов присутствует, сделайте что-то еще.

Вот что я делаю сейчас:

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

Но таким образом я фильтрую все теги <script> с атрибутом for …, но я потерял другие (те, у которых нет атрибута for ).

5 Solutions collect form web for “Проверьте, присутствует ли атрибут в теге в BeautifulSoup”

Если я хорошо понимаю, вам просто нужны все теги скриптов, а затем проверьте некоторые атрибуты в них?

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

Для справок в будущем has_key устарел, is beautifulsoup 4. Теперь вам нужно использовать has_attr

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

Вам не нужны никакие lambdas для фильтрации по атрибуту, вам просто нужно установить src=True т. Д.:

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

Вы также можете использовать re с find / find_all и т. Д.:

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

Если вам нужно только получить теги (ы) с атрибутами (-ами), вы можете использовать lambda:

 soup = bs4.BeautifulSoup(YOUR_CONTENT) 
  • Теги с атрибутом
 tags = soup.find_all(lambda tag: 'src' in tag.attrs) 

ИЛИ

 tags = soup.find_all(lambda tag: tag.has_attr('src')) 
  • Конкретный тег с атрибутом
 tag = soup.find(lambda tag: tag.name == 'script' and 'src' in tag.attrs) 
  • И т.д …

Думал, что это может быть полезно.

Используя модуль pprint, вы можете изучить содержимое элемента.

 from pprint import pprint pprint(vars(element)) 

Использование этого элемента bs4 будет печатать что-то похожее на это:

 {'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': <h1 class="pie-compoundheader" itemprop="name">\n<span class="pie-description">Bedside table</span>\n<span class="pie-productname size-3 name global-name">\n\t\t\t\tNESNA\n\t</span>\n</h1>, 'parser_class': <class 'bs4.BeautifulSoup'>, 'prefix': None, 'previous_element': u'\n', 'previous_sibling': u'\n'} 

Чтобы получить доступ к атрибуту – скажем, список классов – используйте следующее:

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

Вы можете фильтровать элементы, используя этот подход:

 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 
  • Как я могу захватить ряды данных из файла xml или tcx
  • Красивый суп findAll не найти их все
  • Невозможно получить китайские тексты при очистке
  • Красивый суп, не получающий данные NBA.com
  • Глубина первого прохода на дереве парса BeautifulSoup
  • Красивый суп бросает `IndexError`
  • XPath не работает для очистки экрана
  • Кодек Python ASCII не может кодировать ошибку символа во время записи в CSV
  • Python - лучший язык программирования в мире.