我对python很陌生,我在玩一些代码。实际上,我正在尝试解析一个html网页,并从解析的文档中提取一些信息:
from urllib import request
from bs4 import BeautifulSoup
#some code here...
link = str(input("Enter URL: "))
sock = request.urlopen(link)
pageText = sock.read()
sock.close()
#some code here...
file = open("C:/test.txt", 'w')
file.write(pageText.decode("utf-8"))
#some code here...
我发现了这个错误文件.write()行,我在互联网上搜索仍然没有线索如何修复。你知道吗
错误:
Traceback (most recent call last):
File "C:/Users/Monster/PycharmProjects/TestPro_1/Testfile.py", line 16, in <module>
file.write(pageText.decode("utf-8"))
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 413334-413340: character maps to <undefined>
我的代码非常适合这样的网站www.google.com或者www.flipkart.com并给出一些URL的错误,如www.facebook.com以及www.youtube.com。我想一个可能的原因是它不适用于www.facebook.com以及youtube.com网站因为它们是用PHP或其他语言开发的,而不是HTML网页,对吗?你知道吗
问题是您试图用
cp1252
编码写入文本文件,但是您的数据包含cp1252
中不存在的字符。你知道吗在Python中,^{} 函数对文本文件采用可选的
encoding
参数。正如文件所说,如果你没有具体说明:在Windows上,该函数返回的“首选编码”将是您为系统设置的默认值。在美国版本的Windows上,如果您没有更改设置,那么预先配置的默认值是“codepage1252”,这是微软对IBM拉丁语-1的变体。它只能处理256个不同的字符(与Unicode中的前256个字符几乎相同,但不完全相同)。如果你有任何其他字符,你会得到一个错误。你知道吗
这种方法在某些页面上有效,但在其他页面上无效的原因是,有些页面只有适合每个字符集的普通英文字符。你知道吗
如果确实要保存UTF-8文本文件,则必须明确执行以下操作:
如果要保存cp1252文本文件,或者不管系统的默认编码是什么(可能是UTF-8),如果有人通过跳过、替换或转义不适合cp1252的字符在Mac上运行您的脚本,或者在日语Windows框中运行基于Shift-JIS的cp932,您也可以这样做:
当然,如果您想要cp1252,无论系统设置为什么,都可以这样说:
如果要保存原始字节而不必担心它们是什么,请以二进制模式打开文件,不要首先
decode
字节:当然,如果你在cp1252(或Shift-JIS等)文本编辑器中打开这个文件,它看起来会像mojibake…但这不再是你程序的错了。:)
不过,你还有一个问题。假设每个网页都是UTF-8。那不是真的。事实上,HTML5之前的web页面默认使用拉丁语1,但是它们可以在标题中指定不同的编码(或者在
meta
标记中,或者对于XHTML,在顶级XML标记中)。特别是,在Facebook页面上尝试以下操作:所以你知道,在这种情况下,是UTF-8。你知道吗
对于HTML5,它是…a lot more complicated。理想情况下,您会希望使用一个库来为您实现这一点。(由于您已经在使用BeautifulSoup,在许多常见情况下,它的“Unicode,dammit”会很好地工作,对于HTML5之前的版本也很好,但是标准正确的实现更好。)
相关问题 更多 >
编程相关推荐