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
让我们看看下面的代码段 -
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