BeautifulSoup получить ближайший тег с классом, а не брат и вложенный в неизвестного брата - PullRequest
0 голосов
/ 24 января 2019
<h3>
    <span></span>
    <span class='headline'>Headline #1</span>
</h3>
<table class='striped'></table>
<h4>
    <span class='headline'>Headline #2</span>
</h4>
<table class='striped'></table>
<p>
    <span class='headline'>Headline #3</span>
</p>
<ul></ul>
<center>
    <table class='striped'></table>
</center>

Это моя структура.Я перечисляю теги таблицы и хочу получить текстовое значение тегов span с классом заголовка, ближайшим к моей таблице.Под «ближайшим» я подразумеваю, что если вы хотите выровнять html, я хочу нацелить интервал на класс «заголовок», который вы встретите первым, если начнете с точки таблицы

Иногда эти промежутки вложены в тег h3, иногда h4, иногда ap.Иногда табличный тег находится на том же уровне, что и h3 / h4 / p, а иногда он сам вложен в центральный тег.И иногда тег h3 / h4 / p является непосредственным братом таблицы, а иногда - нет.

Как я могу использовать BeautifulSoup, чтобы найти ближайший span.headline независимо от уровня вложенности и от того, находится ли он внутри родительского или родного брата?

Пока у меня есть этот код

tables = soup.findAll("table", {"class": ["striped"]})

for index, table in enumerate(tables):
    headline = table.find_previous('h3').("span", {"class" : ["headline"]}).text

1 Ответ

0 голосов
/ 25 января 2019

Мне удалось использовать метод find_previous в каждой таблице, чтобы найти предыдущий заголовок для предоставленного вами образца HTML.Я добавил дополнительный атрибут idx к каждой таблице, чтобы использовать его при проверке, относится ли заголовок к этой таблице.Я также добавил две таблицы в начало и конец HTML, которые не имеют предыдущего заголовка.

html = '''
<table class='striped'></table>
<h3>
    <span></span>
    <span class='headline'>Headline #1</span>
</h3>
<table class='striped'></table>
<h4>
    <span class='headline'>Headline #2</span>
</h4>
<table class='striped'></table>
<p>
    <span class='headline'>Headline #3</span>
</p>
<ul></ul>
<center>
    <table class='striped'></table>
</center>
<table class='striped'></table>
</div>
'''.replace('\n', '')

soup = BeautifulSoup(html, 'lxml')
table_query = ('table', {'class': 'striped'})
headline_query = ('span', {'class': 'headline'})

for idx, table in enumerate(soup.find_all(*table_query)):
    table.attrs['idx'] = idx
    previous_headline = table.find_previous(*headline_query)
    if (previous_headline and 
        previous_headline.find_next(*table_query).attrs['idx'] == idx):
        print(previous_headline.text)
    else:
        print('No headline found.')

Вывод:

No headline found.
Headline #1
Headline #2
Headline #3
No headline found.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...