UnicodeDecodeError - 保存Python新手

时间:2014-07-12 21:26:03

标签: python python-2.7 utf-8 beautifulsoup python-unicode

编辑:我很感激我的问题可能已经得到了回答,但我不确定它是否已在链接帖子中得到解答。无论如何,我想说的是我对此很新,即使答案存在,我也不太明白如何将它应用到我的情况中。如果有人能帮助它更明确一点,我会很感激。

我的Python经验确实不到24小时,所以我希望你能忽略我无法将其他主题的建议应用到我自己的问题中。

我正在使用BeautifulSoup拉下桌子,但我得到了奇怪的结果。我正在输入以下内容:

# -*- coding: utf-8 -*-
#Fetch table

import sys
import requests
from bs4 import BeautifulSoup

r = requests.get('http://www.nrc.gov/reactors/operating/list-power-reactor-units.html')

html_soup = BeautifulSoup(r.text)

table = html_soup.find('table')
for row in table.find_all('tr')[1:]:
    col = row.find_all('td')
    print col[0].find('a').get('href') # link
    print col[0].find('a').contents[0] # name
    print col[1].string
    print col[2].string
    print col[3].string
    print col[4].string

我几乎可以肯定我已经看过其他人使用完全相同的代码没有问题,但我得到了废话。当我从命令提示符运行它时,它会正确打印大部分表数据,直到它达到大约三分之二的时间点,这时它给了我:

Traceback (most recent call last):
  File "C:\Python27\test\scrape.py", line 18, in <module>
    print col[3].string
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 31-32: character maps to <undefined>

我以为我可以从IDLE运行以避免命令提示符中的字符限制,但我只是得到了一个不同的错误。在那里,它只抓取第一个链接,然后它吐出这个:

Traceback (most recent call last):
  File "C:\Python27\test\scrape.py", line 15, in <module>
    print col[0].find('a').contents[0] # name
  File "C:\Python27\lib\idlelib\PyShell.py", line 1344, in write
    s = unicode.__getslice__(s, None, None)
TypeError: an integer is required

我还尝试过使用BS4替换带有连字符的en破折号,然后将它们吐出来,但我甚至无法让这个替换工作在一个完全剥离的命令中。当我使用时:

# -*- coding: cp1252 -*-
from bs4 import BeautifulSoup

soup = BeautifulSoup("–")
soup.find(text="–").replaceWith("--")
print soup

我明白了:

Traceback (most recent call last):
  File "C:\Python27\test\replace.py", line 5, in <module>
    soup.find(text="–").replaceWith("--")
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1159, in find
    l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1180, in find_all
    return self._find_all(name, attrs, text, limit, generator, **kwargs)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 484, in _find_all
    strainer = SoupStrainer(name, attrs, text, **kwargs)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1446, in __init__
    self.text = self._normalize_search_value(text)
  File "C:\Python27\lib\site-packages\bs4\element.py", line 1457, in _normalize_search_value
    return value.decode("utf8")
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 0: invalid start byte

这个错误至少从命令行和IDLE都回来了,但我不确定这是好还是坏。

我已经搞砸了几个小时了,虽然我发现了几个人们在谈论UnicodeEncode / DecodeErrors的线程,但我还没有足够强大的语言来解决这个问题。如何将这些答案应用于此。

感谢您的帮助。

0 个答案:

没有答案