Как извлечь повторяющиеся данные отдельно с помощью re - PullRequest
0 голосов
/ 30 мая 2020

У меня есть этот фрагмент кода с html содержимым страницы:

page = """<div>
<span class="item_1" dt="2012.03.12">Item Name 1</span>
<span class="item_2" dt="2012.03.6" time="12:51">Item Name 2</span></div>"""

print(re.findall(('class="(a-z_0-9)"')('dt="(0-9.)"')('>(A-Za-z 0-9)<'),page))

Последняя строка у меня не работает. Может это неправильно. Что мне нужно сделать, так это извлечь класс, dt и текст для каждого диапазона отдельно.

Ожидаемый результат:

[('item_1', '2012.03.12', 'Item Name 1'),
('item_2','2012.03.6','Item Name 2')]

Пожалуйста, помогите!

Ответы [ 2 ]

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

re.findall требуется шаблон регулярного выражения и строка в качестве аргументов, поэтому вам нужно обернуть ваше регулярное выражение вокруг r" и " и избежать любых двойных кавычек по порядку чтобы иметь действительный шаблон:

re.findall(r"('class=\"(a-z_0-9)\"')('dt=\"(0-9.)\"')('>(A-Za-z 0-9)<')",page)

Ваше регулярное выражение также не соответствует требуемой информации. Один из них:

<span.*class="([^"]*)".*dt="([^"]*)".*>(.*)<\/span>

Итак, сложив все вместе, мы получим:

import re

page = """<div>
<span class="item_1" dt="2012.03.12">Item Name 1</span>
<span class="item_2" dt="2012.03.6" time="12:51">Item Name 2</span></div>"""

print(re.findall(r'<span.*class="([^"]*)".*dt="([^"]*)".*>(.*)<\/span>',page))

Что на выходе:

[('item_1', '2012.03.12', 'Item Name 1'), ('item_2', '2012.03.6', 'Item Name 2')]
0 голосов
/ 30 мая 2020

Для синтаксического анализа html лучше использовать BeautifulSoup, что упрощает синтаксический анализ.

from bs4 import BeautifulSoup

page = """<div>
<span class="item_1" dt="2012.03.12">Item Name 1</span>
<span class="item_2" dt="2012.03.6" time="12:51">Item Name 2</span></div>"""

soup = BeautifulSoup(page, "html.parser")
div = soup.find('div')

for elem in div.findAll(["span"]):
    print(elem.text, "|", elem.attrs)

Item Name 1 | {'class': ['item_1'], 'dt': '2012.03.12'}
Item Name 2 | {'class': ['item_2'], 'dt': '2012.03.6', 'time': '12:51'}
...