Beautiful Soup 简明教程

Beautiful Soup - Error Handling

在尝试使用 Beautiful Soup 解析 HTML/XML 文档时,您可能会遇到错误,这并非来自您的脚本,而是来自片段的结构,因为 BeautifulSoup API 会引发错误。

默认情况下,Beautiful Soup 程序包会将文档解析为 HTML,然而,它非常易于使用,并且使用 beautifulsoup4 非常优雅地处理格式错误的 XML。

要将文档解析为 XML,您需要具有 lxml 解析器,只需要将 "xml" 作为第二个参数传递给 Beautiful Soup 构造函数即可 -

soup = BeautifulSoup(markup, "lxml-xml")

soup = BeautifulSoup(markup, "xml")

一个常见的 XML 解析错误是 -

AttributeError: 'NoneType' object has no attribute 'attrib'

在使用 find() 或 findall() 函数时,某些元素丢失或未定义,可能会发生这种情况。

除了上述提及的解析错误之外,您可能会遇到其他解析问题,例如环境问题,其中您的脚本可能在一个操作系统下工作,但在另一个操作系统下却不行,可能在一个虚拟环境下工作,但在另一个虚拟环境下却不行,或者可能无法在虚拟环境外工作。所有这些问题都可能是因为两个环境有不同的可用解析器库。

建议了解或检查您当前工作环境中的默认解析器。您可以检查当前工作环境中可用的当前默认解析器,或显式地将所需的解析器库作为第二个参数传递给 BeautifulSoup 构造函数。

由于 HTML 标签和属性不区分大小写,所有三个 HTML 解析器都将标签和属性名称转换为小写。但是,如果您要保留混合大小写或大写标签和属性,那么最好将文档解析为 XML。

UnicodeEncodeError

让我们看看下面的代码段 -

Example

soup = BeautifulSoup(response, "html.parser")
   print (soup)

Output

UnicodeEncodeError: 'charmap' codec can't encode character '\u011f'

上面的问题可能是由于两个主要情况造成的。您可能尝试打印您的控制台不知道如何显示的 Unicode 字符。其次,您尝试写入文件,并传递了一个不受默认编码支持的 Unicode 字符。

解决上述问题的一种方法是在生成 soup 以获取所需结果之前对响应文本/字符进行编码,如下所示 -

responseTxt = response.text.encode('UTF-8')
KeyError: [attr]

当有问题的标签没有定义 attr 属性时,访问 tag['attr'] 会导致此错误。最常见的错误是:“KeyError: 'href'”和“KeyError: 'class'”。如果您不确定 attr 是否已定义,请使用 tag.get('attr')。

for item in soup.fetch('a'):
   try:
      if (item['href'].startswith('/') or "tutorialspoint" in item['href']):
      (...)
   except KeyError:
      pass # or some other fallback action

AttributeError

您可能会遇到以下 AttributeError -

AttributeError: 'list' object has no attribute 'find_all'

上述错误主要发生在您期望 find_all() 返回单个标签或字符串时。然而,soup.find_all 返回一个元素 Python 列表。

您需要做的就是遍历列表并从那些元素中获取数据。

为了在解析结果时避免上述错误,该结果将被绕过以确保不会将错误格式的片段插入到数据库中 -

except(AttributeError, KeyError) as er:
   pass