【问题标题】:BeautifulSoup not extracting all html (automatically deleting much of a page's html)BeautifulSoup 未提取所有 html(自动删除页面的大部分 html)
【发布时间】:2013-07-13 15:57:41
【问题描述】:

我正在尝试使用 BeautifulSoup 从网站 (http://brooklynexposed.com/events/) 中提取内容。作为问题的一个例子,我可以运行以下代码:

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>

它正在切断名称为 Comedy Show 的列表以及后面的所有 html,直到最后的结束标记。大多数 html 将被自动删除。我在许多网站上都注意到类似的事情,如果页面太长,BeautifulSoup 无法解析整个页面而只是剪切文本。有人对此有解决方案吗?如果 BeautifulSoup 不能处理这样的页面,有没有人知道其他类似 prettify() 功能的库?

【问题讨论】:

  • 对我来说,全部内容都在那里。从创建soup 对象的代码开始:&gt;&gt;&gt; len(unicode(soup)) 返回107578 您使用的是哪个版本的BS?我正在使用 4.2.0。
  • 您的代码对我来说很好用。如果网络传输在那个确切点被中断(所以你只加载到Comedy Sh),那么 HTML 解析器将“关闭”所有仍然打开的标签,你会看到你得到了什么。
  • 有趣的是,我使用的是 4.2.1 和 Python 2.7。但是,当我使用 3.2 时,它似乎可以工作。这不可能是超时问题,因为如果我将原始 HTML 打印到文件中,那么所有文本都会出现。关于 2.7 解决方案的任何其他想法?否则是时候开始移植我的代码了。
  • 使用了不同的 HTML 解析器? BeautifulSoup 将使用可用的“最佳”解析器,因此如果安装了lxml,例如将使用该解析器。不同的解析器以不同的方式处理损坏的 HTML。你可能想运行.diagnose() method 来看看 BeautifulSoup 告诉你什么。如果您无法弄清楚这告诉您什么,请将输出粘贴到您的问题中。
  • 不确定你是否明白,但它对我来说很好用漂亮的汤 4.1.1 和 python 2.7。我升级到 4.3.1,它仍然可以工作。

标签: python beautifulsoup urllib


【解决方案1】:

我遇到了 bs4 在某些机器上剪切 html 而在某些机器上不剪切 html 的麻烦。它无法重现......

我切换到这个:

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

.. 它现在可以工作了。

【讨论】:

    【解决方案2】:

    它对我来说很好,但是当我说 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?

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多