Skip to main content

Beautiful Soup 3

Beautiful Soup 3是以前的版本系列,不再被积极开发。它目前包装与所有主要的Linux发行版:

$ apt-get install python-beautifulsoup

它也通过PyPi作为 BeautifulSoup 发布:

$ easy_install BeautifulSoup

$ pip install BeautifulSoup

你也可以 下载一个Beautiful Soup 3.2.0

如果你运行 easy_install beautifulsoupeasy_install BeautifulSoup,但你的代码不工作,你错误地安装了Beautiful Soup 3。您需要运行 easy_install beautifulsoup4

Beautiful Soup 3的文档在线存档

将代码移植到BS4

大多数代码写在Beautiful Soup 3将反对Beautiful Soup 4一个简单的变化。所有你应该做的是将包名称从 BeautifulSoup 更改为 bs4。所以这:

from BeautifulSoup import BeautifulSoup

成为这:

from bs4 import BeautifulSoup
  • 如果你得到 ImportError “没有模块名为BeautifulSoup”,你的问题是,你试图运行Beautiful Soup 3代码,但你只安装了Beautiful Soup 4。

  • 如果你得到 ImportError “没有模块命名为bs4”,你的问题是,你试图运行Beautiful Soup 4代码,但你只安装了Beautiful Soup 3。

虽然BS4主要是向后兼容BS3,它的大多数方法已被弃用,并给 PEP 8合规性 新的名称。有许多其他重命名和更改,其中一些破坏向后兼容性。

以下是将BS3代码和习惯转换为BS4所需要知道的内容:

你需要一个解析器

Beautiful Soup 3使用Python的 SGMLParser,这是一个在Python 3.0中被弃用和删除的模块。Beautiful Soup 4默认使用 html.parser,但你可以插入lxml或html5lib,而使用它。参见 安装解析器 进行比较。

由于 html.parserSGMLParser 不是同一个解析器,你可能会发现Beautiful Soup 4给了一个不同的解析树比Beautiful Soup 3同样的标记。如果你换出 html.parser 为lxml或html5lib,你可能会发现解析树再次改变。如果发生这种情况,您需要更新您的抓取代码以处理新树。

方法名称

  • renderContents - > encode_contents

  • replaceWith - > replace_with

  • replaceWithChildren - > unwrap

  • findAll - > find_all

  • findAllNext - > find_all_next

  • findAllPrevious - > find_all_previous

  • findNext - > find_next

  • findNextSibling - > find_next_sibling

  • findNextSiblings - > find_next_siblings

  • findParent - > find_parent

  • findParents - > find_parents

  • findPrevious - > find_previous

  • findPreviousSibling - > find_previous_sibling

  • findPreviousSiblings - > find_previous_siblings

  • nextSibling - > next_sibling

  • previousSibling - > previous_sibling

Beautiful Soup构造函数的一些参数重命名的原因相同:

  • BeautifulSoup(parseOnlyThese=...) - > BeautifulSoup(parse_only=...)

  • BeautifulSoup(fromEncoding=...) - > BeautifulSoup(from_encoding=...)

我重命名了一个与Python 3兼容的方法:

  • Tag.has_key() - > Tag.has_attr()

我重命名了一个属性以使用更准确的术语:

  • Tag.isSelfClosing - > Tag.is_empty_element

我重命名了三个属性,以避免使用对Python有特殊意义的单词。与其他人不同,这些更改是 不向后兼容。 如果您在BS3中使用这些属性,您的代码将在BS4上断开,直到您更改它们。

  • UnicodeDammit.unicode - > UnicodeDammit.unicode_markup

  • Tag.next - > Tag.next_element

  • Tag.previous - > Tag.previous_element

发电机

我给了生成器PEP 8兼容的名称,并将它们转换为属性:

  • childGenerator() - > children

  • nextGenerator() - > next_elements

  • nextSiblingGenerator() - > next_siblings

  • previousGenerator() - > previous_elements

  • previousSiblingGenerator() - > previous_siblings

  • recursiveChildGenerator() - > descendants

  • parentGenerator() - > parents

所以,而不是这个:

for parent in tag.parentGenerator():
    ...

你可以写这个:

for parent in tag.parents:
    ...

(但旧代码仍然可以工作。)

一些发电机用于在完成后产生 None,然后停止。这是一个错误。现在发电机刚停止。

有两个新的发电机,.strings和.stripped_strings.strings 生成NavigableString对象,.stripped_strings 生成已删除空格的Python字符串。

XML

不再有用于解析XML的 BeautifulStoneSoup 类。要解析XML,您将“xml”作为第二个参数传递给 BeautifulSoup 构造函数。出于同样的原因,BeautifulSoup 构造函数不再识别 isHTML 参数。

Beautiful Soup处理空元素XML标签已得到改进。以前,当您解析XML时,必须明确说明哪些标记被视为空元素标记。构造函数的 selfClosingTags 参数不再被识别。相反,Beautiful Soup会将任何空标记视为空元素标记。如果将子元素添加到空元素标记,它将停止为空元素标记。

实体

传入的HTML或XML实体始终转换为相应的Unicode字符。Beautiful Soup 3有一些重叠的方式处理实体,已被删除。 BeautifulSoup 构造函数不再识别 smartQuotesToconvertEntities 参数。 (Unicode,Dammit 仍然有 smart_quotes_to,但是它的默认是现在将智能引号转换为Unicode。)常量 HTML_ENTITIESXML_ENTITIESXHTML_ENTITIES 已经删除,因为它们配置一个功能(将一些但不是所有实体转换为Unicode字符)不再存在。

如果要在输出上将Unicode字符转换回HTML实体,而不是将它们转换为UTF-8字符,则需要使用 输出格式化器

Tag.string 现在递归运行。如果标签A包含单个标签B,没有别的,那么A.string与B.string相同。 (以前,它是无。)

多值属性class 有字符串列表作为它们的值,而不是字符串。这可能会影响您通过CSS类搜索的方式。

如果你通过一个 find* 方法两个 字符串 and 一个特定于标签的参数,如 名称,Beautiful Soup将搜索符合标签特定标准的标签,并且其 Tag.string字符串 的值匹配。它将 not 找到字符串本身。以前,Beautiful Soup忽略了特定于标签的参数,并寻找字符串。

BeautifulSoup 构造函数不再识别 markupMassage 参数。现在解析器的职责是正确处理标记。

很少使用的替代解析器类(如 ICantBelieveItsBeautifulSoupBeautifulSOAP)已被删除。现在是解析器的决定如何处理模糊的标记。

prettify() 方法现在返回一个Unicode字符串,而不是一个字节。