Как выполнить регулярное выражение с помощью Python, но с небольшим поворотом?

#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']