使用Beautifulsoup find_all().get('href')获取错误

时间:2019-01-27 12:36:56

标签: python python-3.x beautifulsoup

我正在尝试为名为“ category-list”的特定类下的链接抓取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..."

阅读有关crummy的BeautifulSoup手册,您似乎可以在标签对象上使用属于BeautifulSoup类的相同方法? 我似乎无法弄清楚我在做什么错...

我已经尝试过许多关于stackoverflow的答案。但是无济于事...

关于MH

2 个答案:

答案 0 :(得分:0)

问题在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/

答案 1 :(得分:0)

问题在于tag_itemsResultSet,而不是Tag

来自the Beautiful Soup documentation

  

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')