2012-05-24 27 views
5

Cập nhật: lỗi này có thể được sao chép đơn giản bằng cách chạy này từ dòng lệnh:Scrapy nhện: đối phó với các trang đã sai xác định mã hóa ký tự

scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future 

Tôi đang sử dụng Scrapy để thu thập dữ liệu trang web. Mỗi trang tôi cạo tuyên bố được mã hóa UTF-8:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 

Nhưng thỉnh thoảng, các trang chứa byte nằm ngoài của UTF-8, và tôi nhận được lỗi Scrapy như:

exceptions.UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 131: invalid continuation byte 

tôi vẫn cần phải loại bỏ các trang này, mặc dù chúng chứa các ký tự không thể áp dụng. Có cách nào để nói với Scrapy để ghi đè lên mã hóa được khai báo của trang và sử dụng mã khác (nói, UTF-16) thay thế?

Đây là nơi các ngoại lệ được bắt:

2012-05-30 14:43:20+0200 [igg] ERROR: Spider error processing <GET http://www.site.com/page> 
    Traceback (most recent call last): 
     File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop 
     self.runUntilCurrent() 
     File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent 
     call.func(*call.args, **call.kw) 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 368, in callback 
     self._startRunCallbacks(result) 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks 
     self._runCallbacks() 
    --- <exception caught here> --- 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks 
     current.result = callback(current.result, *args, **kw) 
     File "/Library/Python/2.7/site-packages/scrapy/core/spidermw.py", line 61, in process_spider_output 
     result = method(response=response, result=result, spider=spider) 
+0

Tùy thuộc vào nơi điều này xảy ra, bạn có thể thêm my_string.encode ('utf8') để phá vỡ lỗi này. –

Trả lời

4

Đã có một số công việc về mã hóa trong phiên bản mới nhất phế liệu (0,15). Nó có thể là giá trị cố gắng phiên bản mới nhất.

Phế liệu cho phép bạn truy cập unicode qua response.body_as_unicode. Điều này xử lý việc phát hiện mã hóa theo cách tương tự như trình duyệt và bạn hầu như luôn luôn sử dụng tính năng này thay vì phần thân thô. Kể từ 0,15 mảnh vụn, nó dựa trên w3lib.encoding.html_to_unicode, với một chút tùy chỉnh.

Quá trình giải mã diễn ra một cách uể oải, khi ai đó yêu cầu unicode. Bạn có thể tạo ra một phản ứng mới, chỉ định mã hóa chính mình từ một trong những bạn nhận được trong nhện, tuy nhiên, điều này không cần thiết.

Nó không rõ ràng từ truy nguyên mà bit mã thực sự gây ra lỗi xảy ra. Có chi tiết nào hơn không? Một khả năng khác có thể là cơ thể bị cắt ngắn bằng cách nào đó.

Nếu các trang này được xử lý chính xác bởi trình duyệt chứ không phải bằng mẩu tin lưu niệm, thì nó sẽ được đánh giá cao nếu bạn có thể tạo một trường hợp thử nghiệm đơn giản và báo cáo lỗi.

+0

Cảm ơn Shane. Lỗi này có thể dễ dàng được sao chép từ vỏ Scrapy: 'scrapy shell http: // www.indiegogo.com/Straight-Talk-About-Your-Future' – Misener

+0

hoạt động cho tôi trên mẩu tin lưu niệm mới nhất, từ vỏ sứt mẻ. Mã hóa được phát hiện là utf8 và body_as_unicode trông ổn. –

+0

Thật vậy! Chỉ cần nâng cấp lên 0,15,1, và nó hoạt động tốt. Cảm ơn! – Misener

0

Tôi giả định rằng điều này xảy ra trong đường ống và không có trong Downloader.

Làm sạch (thay thế byte không thể giải mã được) dữ liệu trước khi bạn điền vào Mục của bạn.

+1

Tôi nghĩ điều đó xảy ra khi sử dụng 'HtmlXpathSelector (response)' – warvariuc

1

Vì bạn có thể nhận mã hóa ký tự khác nhau trên trang web, nên giải mã tất cả dữ liệu đã được cạo thành unicode asap, xử lý nó dưới dạng unicode trong spider, sau đó mã hóa nó thành bất kỳ mã nào bạn yêu cầu vào phút cuối cùng (trước đây) bạn in nó hoặc đưa vào một cơ sở dữ liệu, vv) Tôi thực sự đã viết một đoạn về điều này (dựa trên kinh nghiệm của riêng tôi với cặn bã) hai ngày trước có thể hữu ích http://www.harman-clarke.co.uk/answers/python-web-scraping-unicode.php

Các vấn đề liên quan