我正在尝试为名为“ 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
答案 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_items
是ResultSet
,而不是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')
。