it-swarm.com.ru

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

У меня возникают проблемы при разборе 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'

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

310
Neo

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

mydivs = soup.findAll("div", {"class": "stylelistrow"})
511
Klaus Byskov Pedersen

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

Начиная с 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")
208
jmunsch

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

List of method names changed

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

soup.find_all("html_element", class_="your_class_name")
43
overlord

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

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

Убедитесь, что вы взяли регистр findAll, его нет findall

15
Konark Modi

Специфично для 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">
14
FlipMcF

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

У меня возникают проблемы при разборе 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.

9
Aaron Hall

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

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

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

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']
3
Stgltz

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')
2
QHarr

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

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div
1
Larry Symms

Это должно работать:

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div.find(class_ == "stylelistrow"):
        print div
0
Blue Sky

Начиная с BeautifulSoup 4+,

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

mydivs = soup.find_all('div', 'class_name')

Или, если у вас более одного имени класса, просто передайте список имен классов как параметр, например:

mydivs = soup.find_all('div', ['class1', 'class2'])
0
Shivam Shah