Python - 从HTML页面捕获所有表

时间:2017-06-06 13:55:07

标签: python html email beautifulsoup

我有带有嵌入式HTML表格的电子邮件,我有使用BeautifulSoup提取表格及其中的数据的代码,我的问题是有时它只有在有更多时才能成功捕获一个表格。

Here's an example email

我通常在这些表上运行的代码是:

with open(file_path) as in_f:
    msg = email.message_from_file(in_f)

html_msg = msg.get_payload(1)

body = html_msg.get_payload(decode=True)

html = body.decode()

table = bs4.BeautifulSoup(html).find("table")
data = [[cell.text.strip() for cell in row.find_all("td")] for row in table.find_all("tr")]

但是对于这封电子邮件以及其他类似的电子邮件,我只能成功提取第一个Package。我尝试将一行更改为table = bs4.BeautifulSoup(html).find_all("table"),但find_all在那里没有工作。

对于BeautifulSoup,我是一个新手,所以任何帮助都会受到赞赏,谢谢。

1 个答案:

答案 0 :(得分:1)

我想我看到你做错了什么;

如果你这样做

table = bs4.BeautifulSoup(html).find("table")

它返回一个Tag(即一个元素)。如果你做了

tables = bs4.BeautifulSoup(html).find_all("table")

它返回一个ResultSet(基本上是一个表列表)。到现在为止还挺好!当您尝试将ResultSet视为单个标记时,问题出现在下一行:

... for row in tables.find_all("tr")   # Can't do this!

tables不是单个元素(具有.find_all方法),它是一个元素列表(它没有) - 因此是AttributeError。相反,你必须迭代每个表,如下所示:

tables = bs4.BeautifulSoup(html).find_all("table")
data = []
for table in tables:     # <-- extra level of iteration!
    for row in table.find_all("tr"):
        data.append([cell.text.strip() for cell in row.find_all("td")])

希望有所帮助!