Как найти элементы по классу - PullRequest
320 голосов
/ 18 февраля 2011

У меня проблемы с анализом HTML-элементов с атрибутом "class" с помощью Beautifulsoup.Код выглядит так:

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"] == "stylelistrow"):
        print div

Я получаю сообщение об ошибке в той же строке "после" завершения сценария

File "./beautifulcoding.py", line 130, in getlanguage
  if (div["class"] == "stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
   return self._getAttrMap()[key]
KeyError: 'class'

Как мне избавиться от этой ошибки?

Ответы [ 13 ]

529 голосов
/ 18 февраля 2011

Вы можете уточнить свой поиск, чтобы найти только те div с данным классом, используя BS3:

mydivs = soup.findAll("div", {"class": "stylelistrow"})
213 голосов
/ 09 марта 2014

Из документации:

Начиная с Beautiful Soup 4.1.2, вы можете осуществлять поиск по классу CSS, используя ключевое слово аргумента class_:

soup.find_all("a", class_="sister")

Что в этом случае будет:

soup.find_all("div", class_="stylelistrow")

Это также будет работать для:

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
45 голосов
/ 20 июля 2016

Обновление: 2016 В последней версии beautifulsoup метод findAll был переименован в 'найти все'. Ссылка на официальную документацию

List of method names changed

Следовательно, ответ будет

soup.find_all("html_element", class_="your_class_name")
15 голосов
/ 10 декабря 2014

Специфично для BeautifulSoup 3:

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )

Найдет все это:

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">
15 голосов
/ 10 апреля 2013

Прямой путь будет:

soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
    print each_div

Убедитесь, что вы взяли кожух findAll , а не findall

9 голосов
/ 03 октября 2016

Как найти элементы по классу

У меня проблемы с анализом html-элементов с атрибутом "class" с помощью Beautifulsoup.

Вы можете легко найти по одному классу, но если вы хотите найти по пересечению двух классов, это немного сложнее,

Из документации (выделение добавлено):

Если вы хотите искать теги, которые соответствуют двум или более классам CSS, вам следует использовать селектор CSS:

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]

Для ясности, здесь выбираются только те теги p, которые являются зачеркнутыми и классом тела.

Чтобы найти для пересечения любой в наборе классов (не пересечение, а объединение), вы можете дать список аргументу ключевого слова class_ (по состоянию на 4.1.2) :

soup = BeautifulSoup(sdata)
class_list = ["stylelistrow"] # can add any other classes to this list.
# will find any divs with any names in class_list:
mydivs = soup.find_all('div', class_=class_list) 

Также обратите внимание, что findAll был переименован из camelCase в более Pythonic find_all.

4 голосов
/ 18 февраля 2011

Попробуйте проверить, имеет ли div сначала атрибут класса, например:

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
    if "class" in div:
        if (div["class"]=="stylelistrow"):
            print div
3 голосов
/ 23 мая 2019

CSS-селекторы

первый матч первого класса

soup.select_one('.stylelistrow')

список совпадений

soup.select('.stylelistrow')

составной класс (то есть И другой класс)

soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')

Пробелы в именах составных классов, например class = stylelistrow otherclassname, заменяются на «.».Вы можете продолжить добавлять классы.

список классов (ИЛИ - совпадение в зависимости от того, что присутствует

soup.select_one('.stylelistrow, .otherclassname')
soup.select('.stylelistrow, .otherclassname')
3 голосов
/ 29 июля 2014

Это работает для меня, чтобы получить доступ к атрибуту класса (на beautifulsoup 4, вопреки тому, что сказано в документации). KeyError - это возвращаемый список, а не словарь.

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']
1 голос
/ 11 июня 2013

Это сработало для меня:

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...