【问题标题】:Getting an error using Beautifulsoup find_all() .get('href')使用 Beautifulsoup find_all() .get('href') 时出错
【发布时间】:2019-01-27 12:36:56
【问题描述】:

我正在尝试为名为“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

【问题讨论】:

    标签: python python-3.x beautifulsoup


    【解决方案1】:

    问题出在这一行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/

    【讨论】:

      【解决方案2】:

      问题在于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')

      【讨论】:

      • 啊!我忘记了 tag_items 返回列表的事实!它现在就像一个魅力。 ;) 我认为应该做更多的研究:(
      猜你喜欢
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2021-01-22
      • 2019-12-20
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多