python - Beautifulsoup 过滤器结果在 "for i"循环中引发 KeyError

标签 python python-3.x web-scraping beautifulsoup keyerror

我正在尝试最小化我的代码,使其更有效率。但是,我被这个 KeyError 卡车撞到了,我不知道出了什么问题。请各位大佬帮帮我,指点一下为什么我的表情不对? PS我是业余水平。

使用这些代码:

recommended = soup.select('table:has(font:contains("推荐主题")), '
                          'table:has(font:contains("版块主题"))')
for item in recommended:
    for i in item.select(".folder:has(a)"):

我将拥有以下 DOM:

<td class="folder"><a href="thread-10439294-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
<td class="folder"><a href="thread-10439293-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
<td class="folder"><a href="thread-10439292-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
<td class="folder"><a href="thread-10439290-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>

但是当我再添加一行时,

for item in recommended:
    for i in item.select(".folder:has(a)"):
        url_tail = i['href']

我会得到这个 KeyError:

    return self.attrs[key]
KeyError: 'href'

我想从中得到的是 href 链接,谢谢大家。

最佳答案

@facelessuser 很好地解释了错误 (+) 并给出了我的首选选择器。看起来可能还有另外两个 attribute = value作为计划 B 的选择器可能性

或者:

[href^="thread-"]

或者:

[title="新窗口打开"]

可以用在列表理解中,例如

links =  [item['href'] for item in soup.select('[href^='thread-']')]

您的 select 可能是 item 而不是 soup。如果最终匹配范围太广,您总是可以将父类放入 .folder [title="新窗口打开"]

关于python - Beautifulsoup 过滤器结果在 "for i"循环中引发 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55979050/

相关文章:

python - 我可以使用 k 均值聚类对各种空间模式进行分类吗?

php - 在 PHP 中同时调用多个 API

python - 如何处理需要交互式响应的可执行文件?

jquery - 无法在 Bootstrap 中提交我的模态表单

python-3.x - Pandas DataFrame.plot 未正确设置 xlim 和 ylim

c - 如何使用 C 抓取网页?

Python 网页抓取 Zacks 网站错误 : [WinError 10054] An existing connection was forcibly closed by the remote host

python - 在函数内部使用时 `.append` 和 `+=` 之间的区别

python - 有没有一种简单的方法可以在 Django 模型/Python 类中创建派生属性?

python - 如何比较两个具有 NaN 值的 numpy 数组?