【问题标题】:Excel CSV output appearing wrong after calling Python File调用 Python 文件后 Excel CSV 输出出现错误
【发布时间】:2019-05-16 17:54:11
【问题描述】:

目前在 .csv 中处理以下输出,其中的各种随机字符是不应该出现的玩家姓名和值

(我在下面给出了输出的图片)

我想知道我在努力消除随机字符的代码中哪里出错了

我正在尝试删除下面的字符,例如 Â、Ã、©、‰ 等。 有什么建议吗?

Python 代码

#importing

import requests
from bs4 import BeautifulSoup
import pandas as pd

headers = {'User-Agent': 
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/47.0.2526.106 Safari/537.36'}

#calling websites
page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')

#calling players names
Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
#Let's look at the first name in the Players list.
Players[0].text

#calling value of players
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
#Let's look at the first name in the Values list.
Values[0].text

PlayersList = []
ValuesList = []

for i in range(0,25):
   PlayersList.append(Players[i].text)
   ValuesList.append(Values[i].text)

df = pd.DataFrame({"Players":PlayersList,"Values":ValuesList})

df.to_csv('2000.csv', index=False)

df.head()

================================================ ======================

我的 Excel 输出

【问题讨论】:

  • 您是否尝试过pageTree.text 而不是pageTree.content 以便自动处理编码?可能会发现它会为您解决所有问题。
  • 这些字符显然是从 ISO-8859-1 或 Windows 代码页 1252 上下文中看到的 UTF-8 字符(如 é => é)。输出可能是正确的,是您正在查看它的系统未设置为 UTF-8。
  • 哦,我必须纠正自己。问题是 Excel:stackoverflow.com/questions/6002256/…
  • @JonClements 嘿乔恩,试了一下,它不会改变字符
  • @WalterTross 谢谢你的链接,我在导入和工作后更改了 excel 中的编码

标签: python excel csv web-scraping export-to-csv


【解决方案1】:
...
utf8_bom = '\xEF\xBB\xBF'
with open('2000.csv', 'w') as csv_file:
    csv_file.write(utf8_bom)
    df.to_csv(csv_file, index=False, mode='a')

说明:BOM 是byte order mark (q.v.)。如果 Excel 在 CSV 文件的开头找到它,它会使用它来确定编码,在您的情况下是 UTF-8(默认编码 - 正确 - 对于 Python 3)。


编辑

正如 Mark Tolonen 所指出的,上述的精简版是以下代码:

df.to_csv('2000.csv', encoding='utf-8-sig', index=False)

编码名称中的-sig代表“签名”,即Microsoft软件用于检测编码的开头BOM。另请参阅codecs 手册的Encodings and Unicode 部分。

【讨论】:

  • 或者只是df.to_csv('2000.csv', encoding='utf-8-sig', index=False) :^)
【解决方案2】:

更新:

我已通过以下链接中的以下答案解决了这种情况..

https://stackoverflow.com/a/6488070/10675615

  1. 在 cmd 提示符下将导出的文件另存为 csv
  2. 打开 Excel
  3. 使用数据导入数据-->导入外部数据/获取文本/CSV-->导入数据
  4. 选择“csv”文件类型并浏览到您的文件
  5. 在导入向导中将 File_Origin 更改为“65001 UTF”(或选择正确的语言字符标识符)
  6. 将分隔符更改为逗号
  7. 选择要导入到的位置并完成 这样特殊字符才能正确显示。

**

【讨论】:

    【解决方案3】:

    您的系统似乎正在写入编码为 UTF-8 的文件。 Excel 期望 UTF-8 文件具有 BOM 签名,否则它假定文本文件以特定于区域设置的 ANSI 编码进行编码。这是为了向后兼容,因为 Windows 在 UTF-8 之前就已经存在。

    Python 具有写入 UTF-8 BOM 签名utf-8-sig 的编码,因此只需使用:

    df.to_csv('2000.csv', encoding='utf-8-sig', index=False)
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2018-01-26
      • 2012-04-18
      • 1970-01-01
      • 2019-07-07
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多