У меня проблемы с анализом 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'
Как мне избавиться от этой ошибки?
<.. class="stylelistrow">
соответствует, но нет<.. class="stylelistrow button">
.class_
который работает правильно.Из документации:
Начиная с Beautiful Soup 4.1.2, вы можете осуществлять поиск по классу CSS, используя ключевое слово аргумент
class_
:Который в этом случае будет:
Это также будет работать для:
источник
soup.find_all("a", ["stylelistrowone", "stylelistrow"])
безопаснее, если у вас мало классов.soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})
.Обновление: 2016 В последней версии beautifulsoup метод findAll был переименован в find_all. Ссылка на официальную документацию
Следовательно, ответ будет
источник
Специфично для BeautifulSoup 3:
Найдем все это:
источник
lambda x: 'stylelistrow' in x.split()
просто и красивоПрямой путь будет:
Убедитесь, что вы взяли корпус findAll , но не все
источник
<.. class="stylelistrow">
соответствует, но нет<.. class="stylelistrow button">
.Вы можете легко найти по одному классу, но если вы хотите найти по пересечению двух классов, это немного сложнее,
Из документации (выделение добавлено):
Чтобы было ясно, это выбирает только те теги p, которые являются зачеркнутыми и классом тела.
Чтобы найти пересечение любого из набора классов (не пересечение, а объединение), вы можете дать список
class_
аргументу ключевого слова (по состоянию на 4.1.2):Также обратите внимание, что findAll был переименован из camelCase в более Pythonic
find_all
.источник
CSS селекторы
один класс первый матч
список матчей
составной класс (то есть И другой класс)
Пробелы в именах составных классов, например
class = stylelistrow otherclassname
, заменяются на «.». Вы можете продолжить добавлять классы.список классов (ИЛИ - совпадать с тем, что есть)
BS4 4.7.1 +
Определенный класс, который
innerText
содержит строкуОпределенный класс, который имеет определенный дочерний элемент, например,
a
тегисточник
Начиная с BeautifulSoup 4+,
Если у вас есть одно имя класса, вы можете просто передать имя класса в качестве параметра, например:
Или, если у вас более одного имени класса, просто передайте список имен классов как параметр, например:
источник
Попробуйте сначала проверить, есть ли у div атрибут class, например:
источник
Это работает для меня, чтобы получить доступ к атрибуту класса (на Beautifulsoup 4, вопреки тому, что говорится в документации). KeyError - это возвращаемый список, а не словарь.
источник
следующее сработало для меня
источник
Это сработало для меня:
источник
В качестве альтернативы мы можем использовать lxml, он поддерживает xpath и очень быстро!
источник
Это должно работать:
источник
Другие ответы не сработали для меня.
В других ответах
findAll
он используется на самом объекте супа, но мне нужен был способ найти по имени класса объекты внутри определенного элемента, извлеченного из объекта, который я получил после выполненияfindAll
.Если вы пытаетесь выполнить поиск внутри вложенных элементов HTML, чтобы получить объекты по имени класса, попробуйте ниже -
Обратите внимание:
Я не определяю явно, что поиск выполняется по атрибуту 'class'
findAll("li", {"class": "song_item"})
, поскольку это единственный атрибут, по которому я выполняю поиск, и он будет по умолчанию искать атрибут класса, если вы не сообщаете, какой именно атрибут вы хотите найти.Когда вы делаете
findAll
илиfind
, результирующий объект имеет класс,bs4.element.ResultSet
который является подклассомlist
. Вы можете использовать все методыResultSet
, внутри любого количества вложенных элементов (если они имеют типResultSet
), чтобы найти или найти все.Моя версия BS4 - 4.9.1, версия Python - 3.8.1
источник
Следующее должно работать
замените «totalcount» на имя вашего класса, а «span» - на тег, который вы ищете. Кроме того, если ваш класс содержит несколько имен с пробелами, просто выберите одно и используйте.
PS Это находит первый элемент с заданными критериями. Если вы хотите найти все элементы, замените 'find' на 'find_all'.
источник