为什么这个特定的网站在解析时会导致递归错误?
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 和其他元素似乎有效。
html5lib
和 lxml
都处理这种特殊情况:
bsObj = BeautifulSoup(html.read(), "html5lib")
bsObj = BeautifulSoup(html.read(), "lxml")
请注意,这需要安装 html5lib
and/or lxml
:
pip install html5lib
pip install lxml
我真的找到了这个错误的原因。下载了上述页面并进行了一些修改,直到我将导致错误的 HTML 缩小到只有两个 select。
现在是最精彩的部分。
第一个 select 有大约 1200 个选项,第二个大约有 500 个。没有一个结束 'option' 标签 存在,所有都处于打开状态。解析器将此(逻辑上)理解为乘法 乘法 嵌套 HTML 结构并尽力解开它,直到它用完递归堆栈。
故事结束:)
我一整天都在尝试读取和解析 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 和其他元素似乎有效。
html5lib
和 lxml
都处理这种特殊情况:
bsObj = BeautifulSoup(html.read(), "html5lib")
bsObj = BeautifulSoup(html.read(), "lxml")
请注意,这需要安装 html5lib
and/or lxml
:
pip install html5lib
pip install lxml
我真的找到了这个错误的原因。下载了上述页面并进行了一些修改,直到我将导致错误的 HTML 缩小到只有两个 select。
现在是最精彩的部分。
第一个 select 有大约 1200 个选项,第二个大约有 500 个。没有一个结束 'option' 标签 存在,所有都处于打开状态。解析器将此(逻辑上)理解为乘法 乘法 嵌套 HTML 结构并尽力解开它,直到它用完递归堆栈。
故事结束:)