Python Regex: очистка данных <li>данные <ol><li> данные </li></ol></li> - PullRequest
0 голосов
/ 03 мая 2020

У меня есть файл HTML, и я читаю с Python, и я хотел бы, чтобы при печати я его настраивал.

Сначала я должен напечатать название страны, а затем имя игрока, которому они принадлежат. их страна.

Мой HTML файл выглядит так:

<ul>
<li>
    Australia
    <ol>
        <li>Steve Smith</li>
        <li>David Warner</li>
        <li>Aaron Finch</li>
    </ol>
</li>

<li>
    Bangladesh
    <ol>
        <li>Shakib Al Hasan</li>
        <li>Tamim Iqbal</li>
        <li>Mushfiqur Rahim</li>
    </ol>
</li>


<li>
    England
    <ol>
        <li>Ben Stokes</li>
        <li>Joe Root</li>
        <li>Eoin Morgan</li>
    </ol>
</li>

Теперь я хочу соскоблить эти данные из моего HTML файла:

Australia - Steve Smith, David Warner, Aaron Finch
Bangladesh - Shakib Al Hasan, Tamim Iqbal, Mushfiqur Rahim
England - Ben Stokes, Joe Root, Eoin Morgan

Но я могу только перебирать имена игроков. Это мой код:

import re

file_name = "team.html"
mode = "r"    

with open(file_name, mode) as fp:
    team = fp.read()

pat =  re.compile(r'<li>(.*?)</li>')
result = pat.findall(team)
res = ", ".join([str(player) for player in result])
print(res)

Кроме того, я не использую никакой пакет, такой как bs4. Я хотел бы решить эту проблему с помощью регулярных выражений.

Ответы [ 3 ]

1 голос
/ 03 мая 2020

Здесь решение с использованием регулярных выражений.

import re

file_name = "team.html"
mode = "r"    

with open(file_name, mode) as fp:
    team = fp.read()

regex =  re.compile(r'<li>\s+(?P<country>[A-z ]+)|<li>(?P<name>[A-z ]+)</li>')

country_team_rel = {}
country = None
for result in regex.findall(team):
    if result[0]:
        country = result[0]
        country_team_rel[country] = []
    else:
        country_team_rel[country].append(result[1])

# Or If you like to print
buffer = []
for result in regex.findall(team):
    if result[0]:
        if buffer:
            print(", ".join(buffer))
            buffer = []
        print(result[0] + " - ", end='')
    else:
        buffer.append(result[1])
print(", ".join(buffer))
0 голосов
/ 03 мая 2020

В этом случае может быть ошибкой использовать регулярное выражение. (я не на 100% сюр). Вы должны использовать Beautiful Soup

или даже другие HTML парсер

0 голосов
/ 03 мая 2020

Как уже предлагалось, BeautifulSoup - правильный инструмент для этой задачи:

import bs4
file_name = "team.html"
mode = "r"    
with open(file_name, mode) as fp:
    team = fp.read()
soup = bs4.BeautifulSoup(team)
country = None
for i in soup.findAll('li'):
    if '\n' in i.text: 
         if country:
             print(country,'-', ', '.join(players))
         country = i.text.splitlines()[1].strip()
         players = []
    else:
         players.append(i.text)
print(country,'-', ','.join(players))    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...