2012-06-24 20 views
5

Tôi cần lấy tất cả văn bản từ trang bằng BeautifulSoup. Tại tài liệu của BeautifulSoup, nó cho thấy rằng bạn có thể làm soup.get_text() để làm điều này. Khi tôi đã thử làm điều này trên reddit.com, tôi nhận được lỗi này:Sử dụng soup.get_text() với UTF-8


UnicodeEncodeError in soup.py:16 
    'cp932' codec can't encode character u'\xa0' in position 2262: illegal multibyte sequence 

Tôi gặp lỗi như vậy trên hầu hết các trang web tôi đã kiểm tra.
Tôi gặp lỗi tương tự khi tôi cũng đã làm soup.prettify(), nhưng tôi đã sửa lỗi bằng cách thay đổi nó thành soup.prettify('UTF-8'). Có cách nào để sửa lỗi này không? Cảm ơn trước!

Cập nhật 24 tháng 6
Tôi đã tìm thấy một chút mã mà dường như làm việc cho người khác, nhưng tôi vẫn cần phải sử dụng UTF-8 thay vì mặc định. Mã số:


texts = soup.findAll(text=True) 

    def visible(element): 
     if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: 
     return False 
     elif re.match('', str(element)): return False 
     elif re.match('\n', str(element)): return False 
     return True 

    visible_texts = filter(visible, texts) 

    print visible_texts 

Lỗi khác nhau. Phát triển?


UnicodeEncodeError in soup.py:29 
'ascii' codec can't encode character u'\xbb' in position 1: ordinal not in range 
(128) 

Trả lời

0

Bạn không thể làm str (văn bản) nếu bạn có thể đang xử lý unicode trên trang. Thay vì str(), sử dụng unicode().

1

soup.get_text() trả về chuỗi Unicode là lý do bạn gặp lỗi.

Bạn có thể giải quyết vấn đề này theo một số cách bao gồm cài đặt mã hóa ở cấp độ vỏ.

export PYTHONIOENCODING=UTF-8 

Bạn có thể tải lại sys và đặt mã hóa bằng cách đưa mã này vào tập lệnh.

if __name__ == "__main__": 
    reload(sys) 
    sys.setdefaultencoding("utf-8") 

Hoặc bạn có thể mã hóa chuỗi dưới dạng mã utf-8. Đối với vấn đề reddit của bạn, một số thông tin như sau sẽ hoạt động:

import urllib 
from bs4 import BeautifulSoup 

url = "https://www.reddit.com/r/python" 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html) 

# get text 
text = soup.get_text() 

print(text.encode('utf-8')) 
Các vấn đề liên quan