2013-07-15 45 views
6

我想使用BeautifulSoup从网站中提取内容(http://brooklynexposed.com/events/)。正如我可以运行下面的代码问题的一个例子:BeautifulSoup没有提取所有的HTML(自动删除大部分页面的html)

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') 

输出似乎切断HTML如下:

 <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> 

它沿着切断上市名称为喜剧表演与所有的HTML,直到最后的结束标签。大多数的html被自动删除。我在很多网站上注意到类似的事情,如果页面太长,BeautifulSoup无法解析整个页面,只是删除文本。有没有人有这个解决方案?如果BeautifulSoup无法处理这些页面,是否有人知道其他类似于prettify()的函数库?

+3

你的代码对我来说很好。如果网络传输在那个时间点被中断(所以你只能装载到“喜剧Sh”),那么HTML解析器将“关闭”所有仍然打开的标签,并且你确切地看到你得到了什么。 –

+1

对我而言,整个内容都在那里。从您的代码开始创建'soup'对象:'>>> len(unicode(soup))'''107578'您使用的是哪个版本的BS?我正在使用4.2.0。 –

+0

有趣的是,我在Python 2.7中使用4.2.1。但是,当我使用3.2它似乎工作。它不可能是超时问题,因为如果我将原始HTML打印到一个文件中,那么所有文本都会出现。有关2.7解决方案的任何其他想法?否则,是时候开始移植我的代码了。 – user2540231

回答

0

它的工作为我好,但我得到的错误,当我说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' 

。 。 。 。 我想这可能会帮助你:BeautifulSoup, where are you putting my HTML?

0

我有麻烦,bs4削减一些机器上的html和一些没有。这不是可重放....

我切换到这一点:

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

..和现在的工作。

相关问题