Я немного потерян с KeyError в цикле FOR i - PullRequest
2 голосов
/ 04 мая 2019

Я пытаюсь минимизировать свои коды, делая их более эффективными. Тем не менее, я получил удар от этого грузовика 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']

Я получу эту ключевую ошибку:

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

То, что я пытаюсь извлечь из этого, это ссылки на href, Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

@ facelessuser хорошо объяснил ошибку (+) и дал мой выбор первого выбора.Похоже, что могут быть два других attribute = value возможности выбора в виде плана Bs

Либо:

[href^="thread-"]

Или:

[title="新窗口打开"]

Который может использоваться в понимании списка, например

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

Ваш select может быть выключен item, а не soup.Вы всегда можете добавить родительский класс, если это заканчивается слишком широким соответствием .folder [title="新窗口打开"]

2 голосов
/ 04 мая 2019

.folder:has(a) выбирает элемент td, так как этот элемент имеет класс .folder и имеет дочерний элемент a.Он не выбирает элемент a, просто проверяет, что элемент с .folder имеет элемент a.

Возможно, вам нужно что-то вроде .folder a.

0 голосов
/ 04 мая 2019

Вы можете попробовать вот так.

Поскольку у меня нет полного HTML или URL, по которым вы нажимаете, я просто попытался получить значения href изHTML-текст, который вы вставили.

1) Импортировать и создать объект BeautifulSoup "

>>> 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"

>>> 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) Осмотреть (только для проверки) "

>>> 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 способа) "

>>> # 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
>>> 
>>> 
...