Получение ошибки с помощью Beautifulsoup find_all () .get ('href') - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь очистить html для ссылок в определенном классе, называемом «список категорий». Каждая ссылка находится в теге h4 (я игнорирую его родительский тег h3):

<ul class="category-list">
      <li class="category-item">
       <h3>
        <a href="/derdubor/c/alarm_og_sikkerhet/">
         Alarm og sikkerhet
        </a>
       </h3>
       <ul>
        <li>
         <h4>
          <a href="/derdubor/c/alarm_og_sikkerhet/brannsikring/">
           <span class="category-has-customers">
            Brannsikring
           </span>
           (1)
          </a>
         </h4>
        </li>
       </ul>
      </li>

...

Мой код для очистки html следующий:

r = request.urlopen(str_top_url)

soup = BeautifulSoup(r.read(),'html.parser')

tag_category_list = soup.find('ul', class_ = 'category-list')

tag_items = tag_category_list.find_all('h4')

for tag_item in tag_items.find_all('a'):
    print(tag_item.get('href'))

Я получаю сообщение об ошибке:

"ResultSet object has no attribute '%s'. You're probably treating a list of items like a single item..."

Чтение руководства BeautifulSoup по crummy, этоПохоже, вы можете использовать те же методы, принадлежащие классу BeautifulSoup для объекта тега?Кажется, я не могу понять, что я делаю не так ...

Я попробовал множество ответов на нее на stackoverflow.Но безрезультатно ...

С уважением, МХ

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Проблема в том, что tag_items это ResultSet, а не Tag.

С Документация "Красивый суп" :

AttributeError: 'ResultSet' object has no attribute 'foo' - Обычно это происходит потому, что вы ожидали, что find_all() вернет один тег или строку. Но find_all() возвращает список тегов и строк - объект ResultSet. Вам нужно перебрать список и посмотреть на .foo каждого из них. Или, если вы действительно хотите только один результат, вам нужно использовать find() вместо find_all().

Так что этот вложенный цикл должен работать:

for tag_item in tag_items:
    for link in tag_item.find_all('a'):
        print(link.get('href'))

Или, если вы ожидаете только один h4, измените find_all('h4') на find('h4').

0 голосов
/ 27 января 2019

Проблема в этой строке for tag_item in tag_items.find_all('a'):.Сначала вы должны пройти по элементам tag_items и сквозным элементам find_all ('a').Вот отредактированный код:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<ul class="category-list"><li class="category-item"><h3><a href="/derdubor/c/alarm_og_sikkerhet/">Alarm og sikkerhet</a></h3><ul><li><h4><a href="/derdubor/c/alarm_og_sikkerhet/brannsikring/"><span class="category-has-customers">Brannsikring</span>(1)</a></h4></li></ul></li>','html.parser')

tag_category_list = soup.find('ul', class_ = 'category-list')

tag_items = tag_category_list.find_all('h4')

for elm in tag_items:
    for tag_item in elm.find_all('a'):
        print(tag_item.get('href'))

А вот и результат: /derdubor/c/alarm_og_sikkerhet/brannsikring/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...