BeautifulSoup - помогите мне выбрать дивы и классы - PullRequest
0 голосов
/ 13 апреля 2011

Вот мой код HMTL:

<div class="BlockA">
    <h4>BlockA</h4>
    <div class="name">John Smith</div>
    <div class="number">2</div>
    <div class="name">Paul Peterson</div>
    <div class="number">14</div>
</div>

<div class="BlockB">
    <h4>BlockB</h4>
    <div class="name">Steve Jones</div>
    <div class="number">5</div>
</div>

Уведомление BlockA и BlockB.Оба содержат одинаковые элементы, то есть name и number, но находятся внутри отдельных классов.Я новичок в Python и думал попробовать что-то вроде:

parsedHTML = soup.findAll("div", attrs={"name" : "number"})

, но это просто дает мне пустой экран.Могу ли я сделать findAll из blockA, отобразить данные, затем запустить еще один цикл с BlockB и сделать то же самое?

Спасибо.

РЕДАКТИРОВАТЬ:Для тех, кто спрашивает, я хочу просто просмотреть значения и вывод в формате JSON следующим образом:

BlockA
    John Smith
    2
    Paul Peterson
    14

BlockB
    Steve Whoever
    123
    Mr Whathisface
    23

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Вы хотите найти div, которые содержат атрибут класса "name" или "number"?

>>> import re
>>> soup.findAll("div", {"class":re.compile("name|number")})

[<div class="name">John Smith</div>, <div class="number">2</div>, <div class="name">Paul Peterson</div>, <div class="number">14</div>, <div class="name">Steve Jones</div>, <div class="number">5</div>]
0 голосов
/ 13 апреля 2011

Вам необходимо использовать список возможных class значений.

soup.findAll('div', {'class': ['name', 'number']})

После просмотра вашей правки:

def grab_content(heading):
    siblings = [s.contents[0] for s in heading.findNextSiblings()]
    return {heading.contents[0]: siblings}

headings = soup.findAll('h4')
[grab_content(h) for h in headings]

И вывод для вашего исходного фрагмента HTML будет:

[{u'BlockA': [u'John Smith', u'2', u'Paul Peterson', u'14']},
 {u'BlockB': [u'Steve Jones', u'5']}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...