2013-07-15 39 views
6

Tôi đang cố gắng sử dụng BeautifulSoup để trích xuất nội dung từ một trang web (http://brooklynexposed.com/events/). Như một ví dụ về vấn đề tôi có thể chạy đoạn mã sau:BeautifulSoup không trích xuất tất cả html (tự động xóa nhiều html của một trang)

import urllib 
import bs4 as BeautifulSoup 

url = 'http://brooklynexposed.com/events/' 
html = urllib.urlopen(url).read() 

soup = BeautifulSoup.BeautifulSoup(html) 
print soup.prettify().encode('utf-8') 

Sản lượng dường như cắt đứt html như sau:

 <li class="event"> 
     9:00pm - 11:00pm 
     <br/> 
     <a href="http://brooklynexposed.com/events/entry/5432/2013-07-16"> 
     Comedy Sh 
     </a> 
     </li> 
     </ul> 
    </div> 
    </div> 
    </div> 
    </div> 
</body> 
</html> 

Nó được cắt ra khỏi danh sách với tên Comedy Hiện cùng với tất cả html đến sau cho đến khi các thẻ đóng cuối cùng. Đa số các html đang được tự động loại bỏ. Tôi đã nhận thấy những điều tương tự trên nhiều trang web, rằng nếu trang quá dài, BeautifulSoup không phân tích toàn bộ trang và chỉ cắt bớt văn bản. Có ai có một giải pháp cho điều này? Nếu BeautifulSoup không có khả năng xử lý các trang như vậy, có ai biết bất kỳ thư viện nào khác có chức năng tương tự như prettify() không?

+3

Mã của bạn chỉ hoạt động tốt cho tôi. Nếu chuyển mạng bị gián đoạn tại điểm chính xác đó (vì vậy bạn chỉ nạp cho đến khi 'Comedy Sh') thì trình phân tích cú pháp HTML sẽ 'đóng' tất cả các thẻ vẫn mở và bạn thấy chính xác những gì bạn có. –

+1

Đối với tôi, toàn bộ nội dung ở đó. Bắt đầu với mã của bạn để tạo đối tượng 'soup':' >>> len (unicode (soup)) 'trả về' 107578' Bạn đang sử dụng phiên bản BS nào? Tôi đang sử dụng 4.2.0. –

+0

Thú vị, tôi đã sử dụng 4.2.1 với Python 2.7. Tuy nhiên khi tôi sử dụng 3,2 nó dường như làm việc. Nó không thể là một vấn đề thời gian chờ vì nếu tôi đã in HTML gốc thành một tệp thì tất cả văn bản xuất hiện. Bất kỳ ý tưởng khác về một giải pháp cho 2,7? Nếu không thì đã đến lúc bắt đầu chuyển mã của tôi. – user2540231

Trả lời

0

Đó là làm việc tốt cho tôi, nhưng tôi nhận được lỗi khi tôi nói soup.prettify().encode('utf-8')

>>> from BeautifulSoup import BeautifulSoup as bs 
>>> 
>>> import urllib 
>>> url = 'http://brooklynexposed.com/events/' 
>>> html = urllib.urlopen(url).read() 
>>> 
>>> 
>>> soup = bs(html) 
>>> soup.prettify().encode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 8788: ordinal not in range(128) 
>>> 
>>> soup.prettify() 
'<!doctype html>\n<!--[if lt IE 7 ]&gt; 
&lt;html class="no-js ie6" lang="en"&gt; &lt;![endif]-->\n 
<!--[if IE 7 ]&gt; 
... 
... 
... 
... 
</body>\n</html>\n' 

. . . . Tôi đoán điều này có thể giúp bạn: BeautifulSoup, where are you putting my HTML?

0

Tôi gặp khó khăn khi bs4 cắt giảm html trên một số máy và một số không. Nó không được reproducable ....

Tôi chuyển sang này:

soup = bs4.BeautifulSoup(html, 'html5lib') 

.. và nó hoạt động ngay bây giờ.

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