修复th后损坏的文本

2024-04-28 13:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

上个月我为this拉丁字典做了一个刮刀。它最终完成了执行(那个网站给了我每页6到8秒的响应时间)。糟糕的是,我发现我的大量数据严重受损……
例如命令ū相关--->;命令\xc5\xabcor | |命令ūcāris--->;命令\xc5\xabc\xc4\x81ris

我犯了一个愚蠢的错误,对从请求中获得的原始数据使用str()函数。就像这样:

import requests

r = requests.get("https://www.dizionario-latino.com/dizionario-latino-
flessione.php?lemma=COMMANDUCOR100", verify = False)

out = str(r.content)

with open("test.html", 'w') as file:
    file.write(out)

如果有人能帮我恢复这段残缺的文字,我将不胜感激。 提前谢谢


Tags: 命令gt字典网站时间outthisrequests
2条回答

r.content返回bytes(相反,^{} returns a ^{}requests模块尝试根据HTTP头猜测正确的解码,并使用该编码为您解码字节。在将来,也许这就是你想用的)

如果r.content包含bytesb'command\xc5\xabcor',则 str(r.content)返回一个str,以字符b'开始,以文字'结束

In [45]: str(b'command\xc5\xabcor')
Out[45]: "b'command\\xc5\\xabcor'"

可以使用^{}恢复字节:

In [46]: ast.literal_eval(str(b'command\xc5\xabcor'))
Out[46]: b'command\xc5\xabcor'

然后您可以将这些bytes解码为str。您发布的URL声明内容是UTF-8编码的:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

假设您下载的所有数据都使用相同的编码,您可以通过调用bytes.decode('utf-8')方法将内容恢复为str:

In [47]: ast.literal_eval(str(b'command\xc5\xabcor')).decode('utf-8')
Out[47]: 'commandūcor'

import ast
import requests

r = requests.get("https://www.dizionario-latino.com/dizionario-latino-flessione.php?lemma=COMMANDUCOR100", verify = False)

out = str(r.content)

with open("test.html", 'w') as file:
    file.write(out)

with open("test.html", 'r') as f_in, open("test-fixed.html", 'w') as f_out:
    broken_text = f_in.read()  
    content = ast.literal_eval(broken_text)
    assert content == r.content
    text = content.decode('utf-8')
    f_out.write(text)

只需使用utf-8(默认值)来^{}它们。您可以在Python的Unicode howto中阅读更多关于字符编码的内容

b'command\xc5\xabcor'.decode()  # 'commandūcor'
b'command\xc5\xabc\xc4\x81ris'.decode()  # 'commandūcāris'

相关问题 更多 >