在文本文件,重音和特殊字符上书写无法正确显示

时间:2015-11-17 16:22:40

标签: python encoding utf-8 web-crawler utf

这就是我正在做的事情,我在网站上进行网页抓取,以便复制文本并将图书的章节放在文本格式中,然后将其转换为另一个程序到pdf自动将其放入我的云。一切都很好,直到发生这种情况:特殊字符没有正确复制,例如重音在文本文件中显示为:\ xe2 \ x80 \ x99, - 显示为\ xe2 \ x80 \ x93。我用过这个:

    for text in soup.find_all('p'):
        texta = text.text
        f.write(str(str(texta).encode("utf-8")))
        f.write('\n')

因为我在阅读这些字符时遇到了一个错误并且它只是停止了我的程序,所以我将所有内容编码为utf-8并使用python的方法将所有内容重新转换为字符串str()

如果有人能更好地解决我的问题,我会发布整个代码,这里是将网页从第1页抓取到max_pages的部分,您可以在第21行修改它以获得更多或更少的章节这本书:

import requests

from bs4 import BeautifulSoup

def crawl_ATG(max_pages):
    page = 1
    while page <= max_pages:
        x= page
        url = 'http://www.wuxiaworld.com/atg-index/atg-chapter-' + str(x) + "/"
        source = requests.get(url)
        chapter = source.content
        soup = BeautifulSoup(chapter.decode('utf-8', 'ignore'), 'html.parser')
        f = open('atg_chapter' + str(x) + '.txt', 'w+')
        for text in soup.find_all('p'):
        texta = text.text
            f.write(str(str(texta).encode("utf-8")))
            f.write('\n')
        f.close
        page +=1

crawl_ATG(10)

当我得到这个问题的解决方案时,我将清理以后复制的第一个无用的行。谢谢

3 个答案:

答案 0 :(得分:1)

我发现解决此问题的最简单方法是在 open 函数中添加 encoding= "utf-8"

with open('file.txt','w',encoding='utf-8') as file :
   file.write('ñoño')

答案 1 :(得分:0)

我能发现的唯一错误是,

str(texta).encode("utf-8")

在其中,您正在强制转换为str并对其进行编码。它应该替换为,

texta.encode("utf-8")

修改

错误源于服务器没有为页面提供正确的编码。因此requests假定为'ISO-8859-1'。正如本bug所述,这是一个深思熟虑的决定。

幸运的是,chardet库正确检测到'utf-8'编码,因此您可以这样做:

source.encoding = source.apparent_encoding
chapter = source.text

并且无需手动解码chapter中的文字,因为requests会使用它来为您解码content

答案 2 :(得分:0)

出于某种原因,你(错误地)在Python3字符串中有utf8编码数据。真正的原因可能是requests.content已经是一个unicode字符串,所以你不应该解码它,而是直接使用它:

    url = 'http://www.wuxiaworld.com/atg-index/atg-chapter-' + str(x) + "/"
    source = requests.get(url)
    chapter = source.content
    soup = BeautifulSoup(chapter, 'html.parser')

如果还不够,那就意味着如果您仍然将'和 - (Unicode u'\u2019'u'\u2013')显示为\xe2\x80\x99\xe2\x80\x93',则可能会导致由html页面未正确声明其编码。在这种情况下,您应首先使用latin1编码编码为字节字符串,然后将其解码为utf8:

chapter = source.content.encode('latin1', 'ignore').decode('utf8', 'ignore')
soup = BeautifulSoup(chapter, 'html.parser')

演示:

t = u'\xe2\x80\x99 \xe2\x80\x93'
t = t.encode('latin1').decode('utf8')

显示:u'\u2019 \u2013'

print(t)

显示:’ –