如何使用re分别提取重复数据

How to extract repeating data separately using re

我有一段代码,其中包含页面的 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))

最后一行对我不起作用。也许这是错误的。我需要做的是分别提取每个跨度的 class、dt 和文本。

预期输出:

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

请帮忙!

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

对于解析 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'}