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



我正在做的是,我在一个网站上进行网络爬行,以供我个人使用,复制文本并将一本书的章节设置为文本格式,然后用另一个程序自动将其转换为pdf,将其放在我的云中。在出现这种情况之前,一切都很好:特殊字符没有正确复制,例如,文本文件上的重音显示为:\xe2\x80\x99,-显示为\xe2\x0\x93。我使用了这个(Python 3):

    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页爬到最大页面的部分,你可以在第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)

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

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

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

由于某些原因,您(错误地)在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')仍显示为xe2x80x99xe2x80x93',这可能是由于html页面没有正确声明其编码所致。在这种情况下,您应该首先使用latin1编码将其编码为字节字符串,然后将其解码为utf8:

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

演示:

t = u'xe2x80x99 xe2x80x93'
t = t.encode('latin1').decode('utf8')

显示:u'u2019 u2013'

print(t)

显示:’ –

我能发现的唯一错误是

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

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

texta.encode("utf-8")

编辑:

错误源于服务器没有为页面提供正确的编码。所以CCD_ 9假定为CCD_。正如这个bug中所指出的,这是一个深思熟虑的决定。

幸运的是,chardet库正确地检测到了'utf-8'编码,因此您可以执行以下操作:

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

并且不需要手动解码chapter中的文本,因为requests使用它来为您解码content

最新更新