将Beautifulsoup输出解析为csv文件以供下载

时间:2016-09-07 11:20:26

标签: python python-3.x csv flask beautifulsoup

我已经浏览了这个网站上的所有问题并且用谷歌搜索但是真的很难拿出Beautifulsoup输出(看起来像是列表)并以csv格式返回它以便我的Flask应用程序的用户可以在浏览器中下载。这是代码:

html = col_result.__html__()
bs = BeautifulSoup(html)
table = bs.find(lambda tag: tag.name == 'table')
headers = table.findAll(lambda tag: tag.name == 'th')
rows = table.findAll(lambda tag: tag.name == 'tr')

with open('export_file.csv', 'w+', newline='') as f:
    file = csv.writer(f)
    file.writerow(headers)
    file.writerows(rows)
rfile = csv.reader(open('export_file.csv', newline=''))

return Response(
    rfile,
    mimetype="text/csv",
    headers={"Content-disposition":
             "attachment; filename=export_file.csv"})

下载后,csv文件为空。我已经导入了csv& bs4模块。任何人都可以建议如何从html生成原始csv数据,以便它可以传递到代码的return response()部分中的'rfile'变量,因为我无法使其工作?

例如,如果我遍历csv.reader对象并打印我得到的每一行,

  <'>'''姓','姓','部门','经理','缺席期','晚期实例']   ['Renata','Krzysik','礼物','MichaeldeJäger','0缺席','0迟到'] ......

...但我无法解决如何解析csv格式(没有列表和html标签)并将其分配给rfile变量?

1 个答案:

答案 0 :(得分:1)

Response类的第一个参数应为

  

响应 - 字符串或响应可迭代

所以我不认为你可以传递csv.reader作为这个参数。请尝试传递文件的string内容。

或者您可以使用make_response并将csv文件的内容传递给它:

from flask import make_response

html = col_result.__html__()
bs = BeautifulSoup(html)
table = bs.find(lambda tag: tag.name == 'table')
headers = table.findAll(lambda tag: tag.name == 'th')
rows = table.findAll(lambda tag: tag.name == 'tr')

with open('export_file.csv', 'w+', newline='') as f:
    file = csv.writer(f)
    file.writerow(headers)
    file.writerows(rows)

with open('export_file.csv', 'r') as csv:
    response = make_response(csv.read())
    response.headers["Content-Disposition"] = "attachment; filename=books.csv"
    return response