首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >美丽汤过滤效果提高"for i“循环中的KeyError

美丽汤过滤效果提高"for i“循环中的KeyError
EN

Stack Overflow用户
提问于 2019-05-04 02:48:16
回答 3查看 138关注 0票数 3

我正在尽量减少我的代码,使它更有效率。然而,我被这辆KeyError卡车撞了,我不知道出了什么问题。请帮帮我,告诉我为什么我的表情不好?我是业余水平的。

有了这些守则:

代码语言:javascript
复制
recommended = soup.select('table:has(font:contains("推荐主题")), '
                          'table:has(font:contains("版块主题"))')
for item in recommended:
    for i in item.select(".folder:has(a)"):

我会让多姆:

代码语言:javascript
复制
<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>

但当我再加一行时,

代码语言:javascript
复制
for item in recommended:
    for i in item.select(".folder:has(a)"):
        url_tail = i['href']

我将得到以下KeyError:

代码语言:javascript
复制
    return self.attrs[key]
KeyError: 'href'

我想要摆脱的是href链接,谢谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-04 04:55:19

@facelessuser很好地解释了错误(+),并给出了我的首选选择器。看起来可能还有另外两种属性=值选择器的可能性,如B计划。

以下任一项:

代码语言:javascript
复制
[href^="thread-"]

或者:

代码语言:javascript
复制
[title="新窗口打开"]

可以用于列表理解,例如

代码语言:javascript
复制
links =  [item['href'] for item in soup.select('[href^='thread-']')]

您的select可能不在item,而不是soup。如果结束时匹配的.folder [title="新窗口打开"]太宽,则始终可以提交父类。

票数 2
EN

Stack Overflow用户

发布于 2019-05-04 04:12:10

.folder:has(a)正在选择td元素,因为该元素具有类.folder,并且具有a的子元素。它不是选择a元素,而是检查带有.folder的元素是否有a元素。

.folder a这样的东西可能就是你想要的。

票数 2
EN

Stack Overflow用户

发布于 2019-05-04 04:19:00

你可以这样做。

由于我没有完整的HTML或Url,所以我只是尝试从粘贴的文本中检索的值。

1)导入和创建BeautifulSoup对象

代码语言:javascript
复制
>>> from bs4 import BeautifulSoup
>>> 
>>> html_text = """<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>"""
>>> 
>>> soup = BeautifulSoup(html_text, "html.parser")
>>>
>>> soup
<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>
>>> 

2)找到所有的tds

代码语言:javascript
复制
>>> tds = soup.find_all("td", class_="folder")
>>> tds
[<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>]
>>> 

3)检查(只是为了测试)

代码语言:javascript
复制
>>> tds[0]
<td class="folder"><a href="thread-10439294-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a></td>
>>> 
>>> tds[0].a
<a href="thread-10439294-1-1.html" target="_blank" title="新窗口打开"><img src="images/green001/folder_new.gif"/></a>
>>> 
>>> tds[0].a.get("href")
'thread-10439294-1-1.html'
>>> 

4)最后,检索链接(2种方式)

代码语言:javascript
复制
>>> # Using loop
... 
>>> for td in tds:
...     print(td.a.get("href"))
... 
thread-10439294-1-1.html
thread-10439293-1-1.html
thread-10439292-1-1.html
thread-10439290-1-1.html
>>> 
>>> for td in tds:
...     print(td.a["href"])
... 
thread-10439294-1-1.html
thread-10439293-1-1.html
thread-10439292-1-1.html
thread-10439290-1-1.html
>>> 
>>> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55979050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档