我想从所有页面获取链接,已经有此代码,但是当我运行代码时,它总是显示错误(返回self.attrs [key])KeyError:'href'。有谁能帮忙,谢谢。这是代码:
from bs4 import BeautifulSoup
import urllib.request
import requests
url = "http://makeupuccino.com/makeup/faces/foundation?page={}"
def get_url(url):
req = urllib.request.Request(url)
return urllib.request.urlopen(req)
link = []
nama = []
merek = []
harga = []
gambar = []
deskripsi = []
page = 1
while (requests.get(url.format(page)).status_code==200):
res = requests.get(url.format(page))
print(res.url)
soup = BeautifulSoup(res.content,"html.parser")
items = soup.findAll("div",{"class":"product-block-inner"})
if len(items)<=1:break #untuk stop ketika produk tidak ditemukan lagi di page selanjutnya
for item in items:
new_link = item.find("div",{"class":"image"})
print(new_link["href"])
page+=1
答案 0 :(得分:0)
您选择了div
元素,它是锚标记的父节点,但没有包含href
元素的锚标记。您需要将.a
添加到循环内的代码中。
类似
print(new_link.a["href"])
将为您正确提供链接。
对于正确的分页,我可以建议您两种方式。
查找页面数并在页面中循环。在您的情况下,页码在page-result
类中给出。您可以通过以下代码找到页码。
page_numbers = soup.find('div', {'class':'page-result'}).text
page_numbers = page_numbers.split('(')[-1].replace(' Pages)', '')
total_pages = ['http://makeupuccino.com/makeup/faces/foundation?page='+str(i) for i in page_numbers] #this list will give you total pages - 4 pages with the link you provided
break
while循环,当There are no products to list in this category.
文本出现在页面中时。使用以下代码进行部署,
soup = BeautifulSoup(res.content,"html.parser")
if 'There are no products to list in this category.' in str(soup):
break
else:
#rest of your code.
尽管第二种解决方案似乎比较简单,但我建议您选择第一种,因为它会教给您很多东西,这也是合适的方法。
希望这会有所帮助!干杯!
答案 1 :(得分:0)
div没有属性href
请尝试以下操作:
new_link = item.find("div",{"class":"image"}).find('a').get('href)
print(new_link)