作者os653 (allstar)
看板Python
标题Re: 一直没有办法read html档
时间Mon Dec 3 13:10:23 2012
※ 引述《left ()》之铭言:
: 各位大大 帮忙一下了
: 目前一直卡在这个档没法子读
: http://www.cmlab.csie.ntu.edu.tw/~left/index813.html
: with open('index813.html','r') as page:
: for each_line in page:
: print(each_line.strip())
: 出现下面error 一直处理不掉
: UnicodeDecodeError: 'cp950' codec can't decode bytes in position 1256-1257: illegal multibyte sequence
: args = ('cp950', b'50"> 6/19</td>\n<td width="120">toughroleX</td...</div>\n</div>\n</div>\n</div>\n</body>\n</html>', 1256, 1258, 'illegal multibyte sequence')
: encoding = 'cp950'
: end = 1258
: object = b'50"> 6/19</td>\n<td width="120">toughroleX</td...</div>\n</div>\n</div>\n</div>\n</body>\n</html>'
: reason = 'illegal multibyte sequence'
: start = 1256
: with_traceback = <built-in method with_traceback of UnicodeDecodeError object>
简单来说,是因为底下这行字无法用 cp950 decode
"[问题] 一般劵商研究员和富邦ARM的抉择?"
就是 "般" 跟 "商" 中间那个看似空白的东西出问题
如果你只是想把可解码的部分印出来,那很简单
用 binary mode 读档,不要用 text mode
然後自己 decode binary data,把无法解码的部分处理掉,像是 ignore
python3 code 如下:
with open('index813.htm', 'rb') as f:
binary_data = f.read()
data = binary_data.decode('cp950', 'ignore')
lines = data.splitlines()
for line in lines:
print(line)
如果你是想分析网页,那就看你要怎麽处理了
ignore 是一种方法,但是会损失资讯
猜编码是一种方法,有现成 module 可用,不过准确率不是 100%
存 binary data 是一种方法,保证不会损失资讯
不过以後绝对会遇到相同问题,要自己知道怎麽解决
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.46.112.229
1F:→ os653:确定要 ignore 的话,直接开 text mode 也可以 12/03 13:16
2F:→ os653:with open('c:\\1.htm', 'r', errors='ignore') as f: 12/03 13:16
3F:推 left:太感谢了 已经解决了 12/03 16:40
4F:推 plover:or try big5-hkscs gb18030 12/05 19:10