【问题标题】:beautifulsoup not working after exception raised引发异常后,beautifulsoup 无法正常工作
【发布时间】:2014-09-20 07:40:23
【问题描述】:

我的程序运行了好几天,但昨天在这个异常被捕获后:

<urlopen error [Errno 111] Connection refused>

现在每次我尝试运行我的代码时都会收到此错误:

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

这是此错误的来源:

t = soup.find("h1", class_="title").get_text()

我不认为问题出在我的代码上,因为它运行了好几天。有没有重启python的按钮:p(开玩笑)

我应该提到,当我在本地机器上运行我的代码时,一切都很好,但在服务器上我不断收到 AttributeError

编辑:

  • 当我打印 soup.body 时,结果是 None
  • 当我打印 soup.title 时,我得到了页面的实际标题
  • html 是正确的

【问题讨论】:

  • 可能您的目标页面的 HTML 已更改,&lt;h1 class="title"&gt; 不再存在...
  • @MattDMo 不,我已经检查过了,还是一样
  • class之后应该有一个下划线_吗?
  • 另外,我知道你在开玩笑,但是如果你正在抓取的目标被存档在 Wayback Machine 上,你实际上可以通过指向存档来“过去”运行你的代码从上周开始。当然,如果您要获取最新数据,那将无济于事。在这种情况下,您需要弄清楚如何解析他们的最新页面。
  • @RachidO.: 大概是因为顶层元素没有名为body 的直接子标签(或者它被破坏了,解析器没有将body 直接放在顶部下方级元素)。如果您确实提供了人们要求的信息(同样,请参见 MCVE 链接),人们可以帮助您调试它。

标签: python python-2.7 beautifulsoup


【解决方案1】:

提示:发布完整的堆栈跟踪,否则无法判断从上到下调用​​发生问题的函数链是什么。

因此,我只能推测:由于soup.body 返回None,可能.find 也执行类似返回None 的操作,否则您不会得到本质上说“没有 get_text() None 中的方法。

显然,这是中间原因,但问题是是什么导致了这个错误(.body().find() 返回None),如果没有完整的堆栈跟踪,这很难。

【讨论】:

    【解决方案2】:

    我通过指定 BeautifulSoup 解析器解决了我的问题,这是因为 BeautifulSoup 解析器的差异。

    BeautifulSoup(urlopen(url), "html5lib")
    

    html5lib 无法从这个特定的 html 中获取正文,所以我将其更改为

    BeautifulSoup(urlopen(url), "html.parser")
    

    【讨论】:

      【解决方案3】:

      我认为是和网络有关。因为它无法连接到服务器所以你无法获取它的html文件,也就是说如果你使用find之类的功能,它会抛出一个错误。

      【讨论】:

      • 这是大错特错。如果 BS 无法获取文件,它会比这次调用更早出错。
      • @LegoStormtroopr:几乎可以肯定......但鉴于 OP 从未告诉我们有关他如何检索文件的任何信息,更不用说向我们展示任何代码,您不能完全排除他编写的可能性一个在失败或愚蠢的情况下返回 '' 的函数。
      猜你喜欢
      • 2020-11-18
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 2019-10-19
      • 2015-06-21
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多