Как найти элементы по классам
у меня возникли проблемы с разбором 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'
Как мне избавиться от этой ошибки?
9 ответов:
вы можете уточнить свой поиск, чтобы найти только те divs с заданным классом, используя BS3:
mydivs = soup.findAll("div", {"class": "stylelistrow"})
из документации:
soup.find_all("a", class_="sister")который в этом случае будет:
soup.find_all("div", class_="stylelistrow")Это также будет работать для:
soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
обновление: 2016 В последней версии beautifulsoup метод 'findAll' был переименован в 'find_all'. ссылка на официальную документацию
следовательно, ответ будет
soup.find_all("html_element", class_="your_class_name")
специфический для 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">
прямой путь будет такой :
soup = BeautifulSoup(sdata) for each_div in soup.findAll('div',{'class':'stylelist'}): print each_divубедитесь, что вы берете корпуса findAll, не findall
как найти элементы по классу
у меня возникли проблемы с разбором 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.
попробуйте сначала проверить, имеет ли div атрибут класса, например:
soup = BeautifulSoup(sdata) mydivs = soup.findAll('div') for div in mydivs: if "class" in div: if (div["class"]=="stylelistrow"): print div
это работает для меня, чтобы получить доступ к атрибуту класса (на beautifulsoup 4, вопреки тому, что говорится в документации). KeyError приходит список возвращается не словарь.
for hit in soup.findAll(name='span'): print hit.contents[1]['class']
это сработало для меня:
for div in mydivs: try: clazz = div["class"] except KeyError: clazz = "" if (clazz == "stylelistrow"): print div

Comments