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



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


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

484   9  

9 ответов:

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

mydivs = soup.findAll("div", {"class": "stylelistrow"})

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

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

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

List of method names changed

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

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

    Ничего не найдено.