#python #html #string #list #replace
Вопрос:
Допустим, у меня есть текстовый файл, содержащий (полученный из источника страницы):
Manager:
<a href="/name/nm0001392/?ref_=adv_li_dr_0"
>Mark Smith</a>
<span class="ghost">|</span>
Managers:
<a href="/name/nm0905154/?ref_=adv_li_dr_0"
>Herb Dean</a>,
<a href="/name/nm0905152/?ref_=adv_li_dr_1"
>Jon Anik</a>
<span class="ghost">|</span>
Manager:
<a href="/name/nm0001392/?ref_=adv_li_dr_0"
>Dominick Cruz</a>
<span class="ghost">|</span>
Я открываю файл с:
with open('managers.txt', 'r') as file:
data = file.read().replace('n', '')
Используя регулярное выражение (или другой способ, если проще, но регулярное выражение-это в основном то, с чем я работал), как я могу получить конечный результат:
результат = [«Марк Смит», «Херб Дин,Джон Аник», «Доминик Круз»]
так что, когда это «Менеджеры», они помещаются в одну и ту же строку в списке, как показано в примере выше.
Я попробовал следующее, но у меня не получилось то, что я хочу:
manager_list= re.findall(r'Manager:<a href=(.*?)</a>', data)
Спасибо вам за любую помощь!
Ответ №1:
Вы можете использовать BeautifulSoup
с itertools.groupby
для группировки блоков имен на span.ghost
разделителях:
import itertools as it
from bs4 import BeautifulSoup as soup
html = ''' Manager:
<a href="/name/nm0001392/?ref_=adv_li_dr_0"
>Mark Smith</a>
<span class="ghost">|</span>
Managers:
<a href="/name/nm0905154/?ref_=adv_li_dr_0"
>Herb Dean</a>,
<a href="/name/nm0905152/?ref_=adv_li_dr_1"
>Jon Anik</a>
<span class="ghost">|</span>
Manager:
<a href="/name/nm0001392/?ref_=adv_li_dr_0"
>Dominick Cruz</a>
<span class="ghost">|</span>
'''
vals = [i.text for i in soup(html, 'html.parser').select(':is(a, span.ghost)')]
r = [','.join(b) for a, b in it.groupby(vals, key=lambda x:x == '|') if not a]
Выход:
['Mark Smith', 'Herb Dean,Jon Anik', 'Dominick Cruz']