我的脚本在csv文件中生成难以辨认的输出

问题描述 投票:-1回答:2

当我运行我的脚本时,我在控制台中获得所需的输出,但是当我在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文件中编写内容?

python python-3.x csv web-scraping
2个回答
0
投票

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

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

如果你把单个元素 - 字符串 - 然后它将其视为字符列表 并且它将每个字符串放在单独的列中 - 因此您在字符之间使用逗号。


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文件看起来像:

অ
অংশ
অংশ
অংশাংশি
অংশান
.
.
.
© www.soinside.com 2019 - 2024. All rights reserved.