我有带有嵌入式HTML表格的电子邮件,我有使用BeautifulSoup提取表格及其中的数据的代码,我的问题是有时它只有在有更多时才能成功捕获一个表格。
我通常在这些表上运行的代码是:
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,我是一个新手,所以任何帮助都会受到赞赏,谢谢。
答案 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")])
希望有所帮助!