我正在做的是,我在一个网站上进行网络爬行,以供我个人使用,复制文本并将一本书的章节设置为文本格式,然后用另一个程序自动将其转换为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'
)仍显示为xe2x80x99
和xe2x80x93'
,这可能是由于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
。