我的脚本在csv文件中产生了难以理解的输出

时间:2019-04-12 03:44:22

标签: python python-3.x csv web-scraping

当我运行脚本时,会在控制台中获得所需的输出,但是当我在csv文件中写入脚本时,输出变得难以辨认。我尝试过encoding="utf-8",但没有运气,还是一样。

sitelink

这些是我愿意在csv文件中编写的内容部分。

অ অংশ অংশ অংশাংশি

到目前为止,我已经写过:

import csv
import requests
from bs4 import BeautifulSoup

url = "http://www.english-bangla.com/browse/bntobn/"

def get_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    items = [item.text for item in soup.select("#cat_page ul > li > a")]
    return items

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        for item in get_links(url):
            writer.writerow(item)
  

如何以正确的方式将内容写入csv文件?

2 个答案:

答案 0 :(得分:1)

我怀疑这是您的问题:

writer.writerow(item)

writerow方法需要一系列项目,其中每个项目都对应于csv文件中的一列。通常,您会以某种可迭代的方式来调用它,例如列表。例如:

writer.writerow(['one', 'two', 'three'])

将在您的csv文件中生成一个如下所示的条目:

one,two,three

在Python中,字符串也恰好是可迭代的。比较一下,我们传递一个项目的列表:

writer.writerow(['this is a test'])

以此,我们在其中传递一个字符串:

writer.writerow('this is a test')

前者将导致:

this is a test

后者将导致:

t,h,i,s, ,i,s, ,a, ,t,e,s,t

因此,您可能想像这样编写主块:

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        for item in get_links(url):
            writer.writerow([item])

或者,如@furas建议的那样,只需摆脱for循环:

if __name__ == '__main__':
    with open("output.csv","w",newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(get_links(url))

两种解决方案都能使您到达同一地点。第二个效率更高。

这将导致一个csv文件,如下所示:

অ
অংশ
অংশ
অংশাংশি
অংশান
.
.
.

答案 1 :(得分:0)

writerow()需要元素列表,而不是单个元素。
然后将每个元素放在单独的列中(使用逗号)

with open("output.csv","w", newline="",encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(get_links(url))

如果您将单个元素-字符串-则将其视为字符列表
并将每个字符放在单独的列中-因此,在字符之间要用逗号分隔。