Tôi nhận được mã nguồn của trang web và mã hóa là cp1252. Chrome hiển thị trang chính xác.Làm thế nào để giải mã cp1252 có dạng thập phân & # 147 thay vì x93?
Đây là mã của tôi:
import sys
from urllib.request import urlopen
from bs4 import BeautifulSoup, UnicodeDammit
import re
import codecs
url = "http://www.sec.gov/Archives/edgar/data/1400810/000119312513211026/d515005d10q.htm"
page = urlopen(url).read()
print(page)
# A little preview :
# b'...Regulation S-T (§232.405 of this chapter) during the preceding 12 months (or for such shorter period that the\nregistrant was required to submit and post such files). Yes <FONT STYLE="FONT-FAMILY:WINGDINGS">x</FONT>...'
soup = BeautifulSoup(page, from_encoding="cp1252")
print(str(soup).encode('utf-8'))
# Same preview section as above
# b'...Regulation S-T (\xc2\xa7232.405 of this chapter) during the preceding 12 months (or for such shorter period that the\nregistrant was required to submit and post such files).\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Yes\xc2\xa0\xc2\xa0<font style="FONT-FAMILY:WINGDINGS">x</font>'
Từ phần xem trước, chúng ta có thể thấy rằng
& nbsp \; = \ xc2 \ xa0
& # 167; = \ xc2 \ xa7
& # 120; = X
Đối với các tiêu chuẩn mã hóa cp1252, tôi đang đề cập đến http://en.wikipedia.org/wiki/Windows-1252#Code_page_layout và /Lib/encodings/cp1252.py
Khi tôi sử dụng BeautifulSoup (trang, from_encoding = "cp1252") một số ký tự được mã hóa một cách chính xác, nhưng một số khác thì không.
ký tự | mã hóa thập phân | cp1252-> utf-8 encoding
“| & # 147; | \ xc2 \ x93 (sai)
”| & # 148; | \ xc2 \ x94 (sai)
X | & # 120; | \ xc2 \ x92 (sai)
§ | & # 167; | \ xc2 \ xa7 (ok)
þ | & # 254;
¨ | & # 168;
'| & # 146; | \ xc2 \ x92 (sai)
- | & # 150;
tôi sử dụng mã này để có được tương đương:
characters = "’ “ ” X § þ ¨ ' –"
list = characters.split()
for ch in list:
print(ch)
cp1252 = ch.encode('cp1252')
print(cp1252)
decimal = cp1252[0]
special = "&#" + str(decimal)
print(special)
print(ch.encode('utf-8'))
print()
offenders = [120, 146]
for n in offenders:
toHex = hex(n)
print(toHex)
print()
#120
off = b'\x78'
print(off)
buff = off.decode('cp1252')
print(buff)
uni = buff.encode('utf-8')
print(uni)
print()
#146
off = b'\x92'
print(off)
buff = off.decode('cp1252')
print(buff)
uni = buff.encode('utf-8')
print(uni)
print()
đầu ra
’
b'\x92'
’
b'\xe2\x80\x99'
“
b'\x93'
“
b'\xe2\x80\x9c'
”
b'\x94'
”
b'\xe2\x80\x9d'
X
b'X'
X
b'X'
§
b'\xa7'
§
b'\xc2\xa7'
þ
b'\xfe'
þ
b'\xc3\xbe'
¨
b'\xa8'
¨
b'\xc2\xa8'
'
b"'"
'
b"'"
–
b'\x96'
–
b'\xe2\x80\x93'
0x78
0x92
b'x'
x
b'x'
b'\x92'
’
b'\xe2\x80\x99'
Một số ký tự không sao chép-dán vào trình soạn thảo như X kỳ lạ và kỳ lạ', vì vậy tôi đã thêm một số mã để đối phó với điều đó.
Tôi có thể làm gì để nhận \ xe2 \ x80 \ x9d thay vì \ xc2 \ x94 cho ”(& # 148;)?
thiết lập của tôi:
Windows 7
Terminal: chcp 1252 + Lucida Console phông chữ
Python 3.3
BeautifulSoup 4
Mong câu trả lời của bạn