Проверьте, присутствует ли атрибут в теге в BeautifulSoup - PullRequest
53 голосов
/ 16 февраля 2011

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

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

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

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

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

Ответы [ 6 ]

75 голосов
/ 16 февраля 2011

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

28 голосов
/ 01 августа 2013

Для дальнейшего использования has_key устарел - Beautifulsoup 4. Теперь вам нужно использовать has_attr

scriptTags = outputDoc.findAll('script')
  for script in scriptTags:
    if script.has_attr('some_attribute'):
      do_something()  
17 голосов
/ 20 августа 2016

Вам не нужны лямбды для фильтрации по атрибуту, вам просто нужно установить 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$"))
11 голосов
/ 26 июля 2015

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

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

OR

tags = soup.find_all(lambda tag: tag.has_attr('src'))
  • Специальный тег с атрибутом
tag = soup.find(lambda tag: tag.name == 'script' and 'src' in tag.attrs)
  • и т. Д. *

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

1 голос
/ 03 января 2018

вы можете проверить наличие какого-либо атрибута

scriptTags = outputDoc.findAll('script', some_attribute=True)
for script in scriptTags:
    do_something()
0 голосов
/ 20 сентября 2016

С помощью модуля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...