为什么这个特定的网站在解析时会导致递归错误?

Why does this specific website cause a recursion error when parsing?

我一整天都在尝试读取和解析 car-part.com 上的一个页面,但遇到了麻烦。我正在使用 beautifulsoup 并且它始终返回递归错误。我最初认为这是由于 html 中的 4k 列表元素造成的,所以我增加了递归限制,但这并没有解决它。我意识到它发生在每个页面上,我不明白为什么它只发生在这个特定的网站上。

这是我遇到的错误:

RecursionError: maximum recursion depth exceeded in comparison

在那之前虽然它不断重复

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents formatter)) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", line 1126, in decode indent_contents, eventual_encoding, formatter) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents formatter)) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", line 1126, in decode indent_contents, eventual_encoding, formatter) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", line 1195, in decode_contents formatter)) ...

问题是我不明白这个console reading是什么意思。网站是否调用了这个文件,这是递归错误?

我不再关心解析站点了,我已经获得了我需要的信息我只是想了解这里到底发生了什么;谁能给我解释一下?

在代码方面post没有太多,对象的任何调用returns递归错误。

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://car-part.com")
bsObj = BeautifulSoup(html.read(), "html.parser")

print(bsObj)

打印 bsObj returns 错误并调用 bsObj.li 也一样,但 .title 和其他元素似乎有效。

html5liblxml 都处理这种特殊情况:

bsObj = BeautifulSoup(html.read(), "html5lib")
bsObj = BeautifulSoup(html.read(), "lxml")

请注意,这需要安装 html5lib and/or lxml

pip install html5lib
pip install lxml

另见 Differences between parsers

我真的找到了这个错误的原因。下载了上述页面并进行了一些修改,直到我将导致错误的 HTML 缩小到只有两个 select。

现在是最精彩的部分。

第一个 select 有大约 1200 个选项,第二个大约有 500 个。没有一个结束 'option' 标签 存在,所有都处于打开状态。解析器将此(逻辑上)理解为乘法 乘法 嵌套 HTML 结构并尽力解开它,直到它用完递归堆栈。

故事结束:)