Beautiful Soup - 错误处理



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

默认情况下,BeautifulSoup 包会将文档解析为 HTML,但是,使用 beautifulsoup4 以非常优雅的方式处理格式错误的 XML 非常容易。

要将文档解析为 XML,您需要安装 lxml 解析器,您只需要将“xml”作为第二个参数传递给 Beautifulsoup 构造函数:

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

或者

soup = BeautifulSoup(markup, "xml")

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

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

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

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

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

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

UnicodeEncodeError

让我们看一下下面的代码段:

示例

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

输出

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
广告
© . All rights reserved.