Разбить HTML-строку на разделы на основе определенного тега на Python - PullRequest
1 голос
/ 30 сентября 2019

Я довольно новичок в питоне. Я провел дни на форуме, и ответы на мой вопрос существуют, но для javascript.

У меня есть html-страница с новостями, и я хочу, чтобы содержимое разбиралось в новом разделе каждый раз, когда есть тег H4. Я хочу назвать раздел на основе содержимого строки, а затем вызвать разделы в отдельные электронные письма (но это будет позже). Я не могу понять, как создать эти разделы. Ниже показано, как выглядит код. Любой совет очень ценится извините, если мой вопрос рудиментарен. Спасибо!

'<td><h3>Andean</h3><hr/></td>
</tr><tr>
    <td><h4>Bolivia bla bla</h4></td>
</tr>             
<tr>
    <td><p>* Bolivia&bla bla text text </p></td>
</tr><tr>
    <td><h3>Brazil</h3><hr/></td>
</tr><tr>
    <td><h4>BRAZIL: bla bla</h4></td>
</tr>             
<tr>'

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Вы можете использовать itertools.groupby:

import itertools, re
from bs4 import BeautifulSoup as soup
r = list(filter(None, [i.find(re.compile('h3|h4')) for i in soup(s, 'html.parser').find_all('td')]))
result = [(a, list(b)) for a, b in itertools.groupby(r, key=lambda x:x.name=='h4')]
final_result = [[b.text for b in result[i][-1]]+[b.text for b in result[i+1][-1]] for i in range(0, len(result), 2)]

Выход:

[['Andean', 'Bolivia bla bla'], ['Brazil', 'BRAZIL: bla bla']]
0 голосов
/ 16 октября 2019

Эй, большое спасибо за помощь @ Ajax1234 и @orangeInk.

Я внимательно посмотрел на код, который за это время изменился. Я закончил тем, что использовал find all h2 для заголовков и div с определенным классом для контента, и перебирал уровни для создания фрейма данных, каждый из которых соответствует разделу / стране. Я не уверен, что то, что я сделал, идеально, но это то, что я получил:

comment_h2_tags = main_table.find_all('div',attrs={'class':'cr_title_in'})
comment_div_tags = main_table.find_all('div',attrs={'class':'itemBody'})

h2s = [] 
for h2_tag in comment_h2_tags:
    h2 = h2_tag
    h2 = (h2.a.text.strip())
    h2s.append(h2)
`

Пока я вменяю название страны вручную, но я нашел Id ', чтобы дать обновление. Спасибо!

0 голосов
/ 30 сентября 2019

Вы можете сделать это «вручную» с помощью регулярных выражений (https://en.wikipedia.org/wiki/Regular_expression)) или использовать библиотеку, созданную специально для анализа HTML (https://pypi.org/project/beautifulsoup4/). Если вы планируете делать больше анализа HTML, я 'Я рекомендую использовать специализированную библиотеку. Если вы не знакомы с ними, вам придется немного привыкнуть к ним, однако стоит изучить оба.

import re
from bs4 import BeautifulSoup

html_code = """<td><h3>Andean</h3><hr/></td>
</tr><tr>
    <td><h4>Bolivia bla bla</h4></td>
</tr>             
<tr>
    <td><p>* Bolivia&bla bla text text </p></td>
</tr><tr>
    <td><h3>Brazil</h3><hr/></td>
</tr><tr>
    <td><h4>BRAZIL: bla bla</h4></td>
</tr>             
<tr>"""

print('* with regex:')
print(re.findall('<h4>(.*?)</h4>', html_code))

print('* with beautiful soup:')
soup = BeautifulSoup(html_code)
tmp = soup.find_all('h4')
for val in tmp:
    print(val.contents)

выведет

* with regex:
['Bolivia bla bla', 'BRAZIL: bla bla']
* with beautiful soup:
['Bolivia bla bla']
['BRAZIL: bla bla']
...