三天前,我开始学习 Python 来创建网络爬虫并收集有关新书发行的信息。我被困在我的目标网站之一......我知道这是一个非常基本的问题,但我看过一些视频,看了很多关于堆栈溢出的相关问题,尝试了 10 多种不同的解决方案,但一无所获。如果有人可以提供帮助,非常感谢:
我的问题: 我可以检索标题信息但无法检索价格信息
数据来源: https://www.bloomsbury.com/uk/non-fiction/business-and-management/?pagesize=25
我的代码:
from bs4 import BeautifulSoup
import requests
import csv
url = 'https://www.bloomsbury.com/uk/non-fiction/business-and-management/?pagesize=25'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
source = requests.get(url, headers=headers).text
#获取标题的代码
soup = BeautifulSoup(source, 'lxml')
for productdetails in soup.find_all("div", class_='figDetails'):
producttitle = productdetails.a.text
print(producttitle)
#获取价格的代码
for productpricedetails in soup.find_all("div", class_='related-products-block'):
productprice = productdetails.find("div", class_="new-price").span.text
print(productprice)
有两个元素的名称为 span,我需要有关第二个的信息,但不知道如何获取。 此外,在尝试不同的可能解决方案时,我不断收到 noneType 错误...
答案 0 :(得分:0)
看起来您尝试抓取的源是通过 Javascript 填充此数据的。
查看页面的源代码,您可以看到原始 HTML 显示您尝试定位的 div 为空。
<html>
...
<div class="related-products-block" id="reletedProduct_490420">
</div>
...
</html>
如果您像这样更新第二个循环,您也可以看到这一点:
for productpricedetails in soup.find_all("div", class_="related-products-block"):
print(productpricedetails)
编辑:
作为奖励,您可以检查页面使用的 Javascript。它很容易理解,请求只返回您要查找的 HTML。为请求准备 JSON 会更复杂一些,但这里有一个例子:
import requests
url = "https://www.bloomsbury.com/uk/catalog/RelatedProductsData"
payload = {"productId": 490420, "type": "List", "ordertype": 0, "formatType": 0}
headers = {"Content-Type": "application/json"}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text.encode("utf8"))