2013-07-25 36 views
7

Tôi đang cố gắng lấy một số văn bản từ tài liệu html bằng BeautifulSoup. Trong một trường hợp rất có liên quan với tôi, nó bắt nguồn từ một kết quả kỳ lạ và thú vị: sau một thời điểm nhất định, súp chứa đầy không gian phụ trong văn bản (một khoảng trống tách từng chữ cái với chữ cái sau). Tôi đã cố gắng tìm kiếm trên web để tìm lý do cho điều đó, nhưng tôi chỉ gặp một số tin tức về lỗi ngược lại (không có khoảng trống nào cả).BeautifulSoup trả lại các khoảng trống thừa bất ngờ

Bạn có một số gợi ý hoặc gợi ý về lý do tại sao điều đó xảy ra và cách giải quyết vấn đề này ?.

Đây là mã rất cơ bản mà tôi tạo ra:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova) 
print soup 

Và đây là một dòng lấy từ các kết quả, đường, nơi vấn đề này bắt đầu xuất hiện:

value = \" Không có vorremmo nuovi uccelli chiamati lontre \ "> < đầu vào onmouseover = \" Mẹo ('< cen terclass = \ \' title _ video \ \ '> <b> G iuseppelabbateo g m? n o n v o r r e m m o n u o v i u c c đ l l i c h i một m t i l o n t r e <

+2

Tại sao bạn in 'ultrasoup'? Nó không phải là 'súp'? – svineet

+0

Cùng một vấn đề ở đây với một trang web khác. Tôi vẫn đang cố gắng tìm hiểu xem đây có phải là vấn đề với BeautifulSoup hay lxml cơ bản không. Phần mềm chạy mà không có vấn đề gì trên một 32bit-Python và thất bại với 64bit. – Matthias

+0

Tôi xin lỗi vì 'ultrasoup', chỉ là một lỗi nhỏ. Tất nhiên, mã đúng là 'in súp' –

Trả lời

10

Tôi tin rằng đây là một lỗi với phân tích cú pháp HTML lxml của. Thử:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen ("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova.replace('ISO-8859-1', 'utf-8')) 
print soup 

Giải pháp nào là vấn đề. Tôi tin rằng sự cố đã được khắc phục trong lxml 3.0 alpha 2 và lxml 2.3.6, vì vậy bạn có thể kiểm tra xem bạn có cần nâng cấp lên phiên bản mới hơn hay không.

Nếu bạn muốn biết thêm về các lỗi nó ban đầu được nộp ở đây:

https://bugs.launchpad.net/beautifulsoup/+bug/972466

Hope this helps,

Hayden

+0

Điều này hoạt động hoàn hảo, cảm ơn.Tôi có thể hỏi bạn những gì thay thế được thay thế trong trường hợp này? Một câu hỏi nữa: beautifulsoup luôn chấp nhận trình phân tích cú pháp html lxml? Nếu không, tại sao tôi đang sử dụng nó, và làm thế nào tôi có thể kiểm soát mà parser tôi áp dụng? Tôi nghĩ rằng những điều này có thể xuất hiện dưới dạng câu hỏi giả, nhưng tôi là người mới bắt đầu trong phân tích cú pháp html –

+0

@Hayden: Ugly, nhưng một giải pháp làm việc. Cảm ơn vì điều đó. – Matthias

4

Bạn có thể chỉ định phân tích cú pháp như html.parser:

soup = BeautifulSoup(prova, 'html.parser') 

Đồng thời bạn có thể chỉ định html5 phân tích cú pháp:

soup = BeautifulSoup(prova, 'html5') 

đã không được cài đặt các html5 phân tích cú pháp chưa? Cài đặt nó từ thiết bị đầu cuối:

sudo apt-get install python-html5lib 

Các phân tích cú pháp xml có thể được sử dụng (soup = BeautifulSoup(prova, 'xml')) nhưng bạn có thể thấy một số khác biệt trong multi-valued attributes như class="foo bar".