【问题标题】:Python - Parsing input html data with beautifulsoup and store output data columnwise in csv filePython - 使用 beautifulsoup 解析输入 html 数据并将输出数据按列存储在 csv 文件中
【发布时间】:2020-07-04 01:07:10
【问题描述】:

我从邮件中提取 html 数据并用 beautifulsoup 解析这些数据。接下来,我想将解析后的数据存储在 csv 文件的正确标题下。但是,输入数据的文本不会相应地显示在输出 csv 文件中。

为 csv 文件解析输入数据 (fruits_html):

Apples                        43        0       0                   0<br/>
Bananas                     2282        0     500                   0<br/>
Grapes                      2534        0     500                   0<br/>
Oranges                      274        0       0                   0<br/>
--------------------------------------------------------------------------------------------------<br/>

脚本:

# Parse raw messages to something readable
soup = BeautifulSoup(raw_email, 'html.parser')
fruits_html = soup.find_all('span')
headers = ["Names", "Quantity", "SpareQty", "MinQty", "MaxQty"]

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter=',')
    csv_output.writerow(headers)
    for br in soup.find_all('span'):
        csv_output.writerow([fruits_html for br in br.find_all('br')])

期望的输出:

我想将所有数量存储在 csv 文件的右侧标题下。不幸的是,我当前的输出在第一行显示标题,在第二行显示不同单元格中的大量&lt;br/&gt;。

【问题讨论】:

  • 那是因为你只写了找到的
    标签。 fruits.html 的来源可以提供帮助。
  • 感谢您的回复。我怎样才能做到这一点?应该写fruits_html 和csv_output.writerow([fruits_html for br in br.find_all('br')]) 对吧?
  • stackoverflow.com/questions/30694558/… 如果没有示例输入 html,我无法进一步帮助您。
  • 对不起,输入的html不是正确的示例吗?你能告诉我你需要什么吗?
  • 请参阅下面的答案。我认为您提供的代码以某种方式处理(删除标签)

标签: python csv parsing beautifulsoup


【解决方案1】:
import csv
from bs4 import BeautifulSoup
from bs4.element import NavigableString
data = '''
<html>
<span>

Apples                        43        0       0                   0<br/>
Bananas                     2282        0     500                   0<br/>
Grapes                      2534        0     500                   0<br/>
Oranges                      274        0       0                   0<br/>

</span>
</html>'''

soup = BeautifulSoup(data, 'html.parser')
#print(soup.find_all("span"))
headers = ["Names", "Quantity", "SpareQty", "MinQty", "MaxQty"]

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter=',')
    csv_output.writerow(headers)
    for br in soup.find_all("span"):
        for item in br.contents:
            if type(item) is not NavigableString:
                continue
            csv_output.writerow(item.strip().split())

带输出.csv

Names,Quantity,SpareQty,MinQty,MaxQty
Apples,43,0,0,0
Bananas,2282,0,500,0
Grapes,2534,0,500,0
Oranges,274,0,0,0

【讨论】:

  • 谢谢!这正是我所需要的,所以我接受了你的回答。但是,我想在 strip 函数中做一个例外。第一列的名称之间可以有空格。在某些情况下,green apples 和其他一些被剥离,而它们应该一起保留在第一列中。当至少出现 3 个空格时,我该如何写应该出现条带?
  • 一个正则表达式可能会起作用,但我不擅长那个。可能有 2 个解决方案(除了正则表达式) 1. 向您发送邮件的人可以添加一个分隔项,如“|”,或将对象封装在另一个标签中 2. a = item.split(" ") # 两个空格 csv_output .writerow([x.strip() for x in a]) 但你必须确保元素之间总是至少有 2 个空格。
  • 感谢您的帮助。我确定我想从至少两个空格中拆分出来。但是,html 文件显示空格,输出 csv 将 ¬† 显示为空格。因此,当尝试实施您的第二个解决方案时,它不会读取空格,也不会在我打算时找到¬†
猜你喜欢
  • 2020-05-03
  • 2020-04-04
  • 2017-08-12
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多