【问题标题】:Why does this specific website cause a recursion error when parsing?为什么这个特定网站在解析时会导致递归错误?
【发布时间】:2016-03-23 03:09:29
【问题描述】:

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

这是我得到的错误:

RecursionError:比较中超出了最大递归深度

在此之前虽然它不断重复

文件 "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py", 第 1195 行,在 decode_contents 中 格式化程序))文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py”, 第 1126 行,在解码中 indent_contents,eventual_encoding,格式化程序)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py”, 第 1195 行,在 decode_contents 中 格式化程序))文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py”, 第 1126 行,在解码中 indent_contents,eventual_encoding,格式化程序)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/element.py”, 第 1195 行,在 decode_contents 中 格式化程序)) ...

问题是我不明白这个控制台读取是什么意思。站点是否在调用此文件,这就是递归错误?

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

在代码方面没有太多要发布的内容,任何对对象的调用都会返回递归错误。

from urllib.request import urlopen
from bs4 import BeautifulSoup

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

print(bsObj)

打印 bsObj 会返回错误,调用 bsObj.li 也可以,但 .title 和其他元素似乎可以工作。

【问题讨论】:

    标签: python recursion beautifulsoup html-parsing


    【解决方案1】:

    html5lib 和 lxml 都处理这种特殊情况:

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

    请注意,这需要安装 html5lib 和/或 lxml:

    pip install html5lib
    pip install lxml
    

    另见Differences between parsers。

    【讨论】:

    • 你说得对,我刚刚安装了库,它读取网站没有问题。你知道问题是什么吗?而且,当控制台以红色打印出文件路径时发生了什么?
    • @NikolaJankovic 好吧,我没有深入研究,但总的来说,不同的解析器有不同的行为和解析算法..
    • 好的,感谢 Alec 的帮助,非常感谢!
    • @NikolaJankovic,我已经够深了,见下文。 WTF 很有趣。
    【解决方案2】:

    我实际上找到了这个错误的原因。下载了该页面并进行了一些修改,直到我将 HTML 缩小到仅导致两个选择的错误。

    现在是好的部分。

    第一个选项有大约 1200 个选项,第二个选项大约有 500 个。没有一个关闭“选项”标签存在,所有选项都处于打开状态。 Parser 将这个(逻辑上)理解为乘法 multiply 嵌套的 HTML 结构,并尽最大努力解开它,直到它用完递归堆栈。

    故事结束:)

    【讨论】:

    • 这太不可思议了,我也注意到 /dealaz.shtml 页面上的列表标签,但没有意识到这是导致问题的原因。我几乎想给他们怀疑的好处,并说这是故意阻止数据挖掘,但我怀疑情况是否如此。无论如何,感谢您花时间调查和解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多