我正在尝试从python代码解析HTML电子邮件以提取各种细节,并且希望使用一两个正则表达式来帮助实现此目的,因为对于我对正则表达式的理解有限,它太复杂了。例如寻找“旅行日期”并提取“ 2018年10月30日(星期二)”。
在所有情况下,<td>
标记中都包含一个字段名,然后在另一组<td>
标记中包含该字段值。有时,名称和值包含在同一行<tr>
标签中(情况1),而有时它们位于单独的行标签中(情况2)。 <span>
和<img>
之类的其他项目也需要跳过。
案例1
<tr>
<td colspan="2"> </td></tr>
<tr><td style="vertical-align: top; font-size: 13px; font-family: Arial; color: #777777;">Travel Date</td>
<td style="vertical-align: top; font-size: 13px; font-family: Arial; color: #444444;">October 30 2018 (Tue)</td>
</tr>
案例2
<tr><td style="vertical-align: top;">
<span style="font-size: 10px; font-family: Arial; color: #999999; font-weight: bold; line-height: 19px; text-transform: uppercase;">Drop-off to Address</span>
</td></tr>
<tr><td style="vertical-align: top;">
<span style="font-size: 13px; font-family: Arial; color: #444444;"><img style="vertical-align:text-bottom;" src="https://d1lk4k9zl9klra.cloudfront.net/Email/Common/address_icon.png" alt="" width="14" height="14" /> 200 George St, Sydney NSW 2000, Australia</span>
</td></tr>
答案 0 :(得分:1)
我将使用Beautiful Soup而不是使用正则表达式。它使遍历HTML元素和抓取所需内容变得更加容易。如果您知道键和值之间的关系,则可以使用它来提取信息。这是情况1的示例:
In [8]: from bs4 import BeautifulSoup
In [9]: text = """
...: <tr>
...: <td colspan="2"> </td></tr>
...: <tr><td style="vertical-align: top; font-size: 13px; font-family: Arial; color:
#777777;">Travel Date</td>
...: <td style="vertical-align: top; font-size: 13px; font-family: Arial; color:
#444444;">October 30 2018 (Tue)</td>
...: </tr>"""
In [11]: soup = BeautifulSoup(text, 'lxml')
In [13]: soup.find_all('td')
Out[13]:
[<td colspan="2"> </td>,
<td style="vertical-align: top; font-size: 13px; font-family: Arial; color:
#777777;">Travel Date</td>,
<td style="vertical-align: top; font-size: 13px; font-family: Arial; color:
#444444;">October 30 2018 (Tue)</td>]
In [15]: for tag in soup.find_all('td'):
...: if tag.text == "Travel Date":
...: print tag.find_next().text
...:
October 30 2018 (Tue)
从网络上抓取HTML时,Beautiful Soup提供了很大的灵活性。