我正在修改现有的Python脚本,该脚本使用正则表达式从HTML计划中提取文本。该脚本除以下情况(非常简化)外,效果很好:
<tr>
<td class="month">September</td>
<td class="date">1</td>
<td class="date">8</td>
<td class="date">15<td>
</tr>
我想返回:
('September', '1'),
('September', '8'),
('September', '15'),
...带有一个正则表达式。编写正则表达式来捕获组很简单。我只是不知道如何用正则表达式创建所需的输出。我尝试了环视,后向引用等的多种组合。我认为这很简单,但找不到正确的正则表达式。任何帮助表示赞赏。
此外,我完全意识到在HTML文本上使用正则表达式不是最好的方法,但是此旧系统运行良好,只需要处理这种情况即可。
类似地,我知道我可以返回各个组并轻松地在Python中创建元组。这种后处理与现有脚本非常不匹配。
答案 0 :(得分:1)
regex
来解析HTML。总是会有不止一种“特殊情况”使您的表情跳动。即使在单个regex表达式中可以实现所需的输出,但是如果HTML以后发生更改,该代码也不容易维护。
解决此问题的通常方法是使用BeautifulSoup
执行此操作。对于您提供的HTML,可以执行以下操作:
from bs4 import BeautifulSoup
html = """<tr>
<td class="month">September</td>
<td class="date">1</td>
<td class="date">8</td>
<td class="date">15</td>
</tr>"""
soup = BeautifulSoup(html, "html.parser")
month = soup.find('td', class_='month').text
dates = [(month, date.text) for date in soup.find_all('td', class_='date')]
print(dates)
这将显示:
[('September', '1'), ('September', '8'), ('September', '15')]