【问题标题】:Unable to scrape website for price element无法抓取网站的价格元素
【发布时间】:2022-07-21 17:46:50
【问题描述】:

我想获取名称、烘焙度和价格,我已经使用下面的代码成功地完成了它。但是我无法刮掉价格。它显示为“无”。

URLS = ["https://www.thirdwavecoffeeroasters.com/products/vienna-roast","https://www.thirdwavecoffeeroasters.com/products/baarbara-estate","https://www.thirdwavecoffeeroasters.com/products/el-diablo-blend","https://www.thirdwavecoffeeroasters.com/products/organic-signature-filter-coffee-blend","https://www.thirdwavecoffeeroasters.com/products/moka-pot-express-blend-1","https://www.thirdwavecoffeeroasters.com/products/karadykan-estate","https://www.thirdwavecoffeeroasters.com/products/french-roast","https://www.thirdwavecoffeeroasters.com/products/signature-cold-brew-blend","https://www.thirdwavecoffeeroasters.com/products/bettadakhan-estate","https://www.thirdwavecoffeeroasters.com/products/monsoon-malabar-aa"]

for url in range(0,10):
    req=requests.get(URLS[url])
    soup = bs(req.text,"html.parser")
    coffees = soup.find_all("div",class_="col-md-4 col-sm-12 col-xs-12")
    for coffee in coffees:
        name = coffee.find("div",class_="product-details-main").find("ul",class_="uk-breadcrumb uk-text-uppercase").span.text
        roast = coffee.find("div",class_="uk-flex uk-flex-middle uk-width-1-1 coff_type_main").find("p",class_="coff_type uk-margin-small-left uk-text-uppercase").text.split("|")[0]
        prices = coffee.find("div",class_="uk-width-1-1 uk-first-column")

        
        
        
        
    print(name,roast,price)

【问题讨论】:

  • 类似于你昨天的问题,如果你打印汤,它会告诉你价格选择器不存在
  • 如果您将req.text 保存到文件中并尝试使用 ctrl+c 查找价格,您会看到它不包含在 HTML 页面中。页面很可能是由 JavaScript 动态加载的。如果您仔细查看req.text,在第 107 行有一个名为meta 的全局变量。该 JavaScript 对象以方便的 JSON 格式包含所有产品价格。您可能决定寻找它,并使用json.loads() 使用json 库对其进行解析。祝你好运!
  • 您可能想重新审视过去几天的问题,查看回复,接受对您有帮助的回复,并将这些回复应用到您的工作中。你可能会取得更大的成功。
  • 另外需要指出的是,您共享的代码 sn-p 引用了一个未定义的 price 变量。此外,最后一个打印语句的缩进是关闭的。当您在 Stack Overflow(或任何其他网站)上发布您的问题时,请尽量小心

标签: python web-scraping beautifulsoup


【解决方案1】:

这里的问题是在响应中你没有得到你正在寻找的 HTML 元素。如果您在req.text 中搜索价格元素,您将找不到它。这可能是因为网站使用 JavaScript 动态呈现页面。

但是,如果您仔细查看 req.text,您可以在 meta JavaScript 对象中找到所有咖啡变体及其各自的价格。您可以使用 json 库中的 loads() 函数查找它并将其解析为 Python 字典。

这是您的工作代码,它还可以打印价格。请注意,所有价格都乘以 100,因此您可能需要考虑这一点。

import requests
from bs4 import BeautifulSoup as bs
import json

URLS = ["https://www.thirdwavecoffeeroasters.com/products/vienna-roast","https://www.thirdwavecoffeeroasters.com/products/baarbara-estate","https://www.thirdwavecoffeeroasters.com/products/el-diablo-blend","https://www.thirdwavecoffeeroasters.com/products/organic-signature-filter-coffee-blend","https://www.thirdwavecoffeeroasters.com/products/moka-pot-express-blend-1","https://www.thirdwavecoffeeroasters.com/products/karadykan-estate","https://www.thirdwavecoffeeroasters.com/products/french-roast","https://www.thirdwavecoffeeroasters.com/products/signature-cold-brew-blend","https://www.thirdwavecoffeeroasters.com/products/bettadakhan-estate","https://www.thirdwavecoffeeroasters.com/products/monsoon-malabar-aa"]


for url in URLS:
    req=requests.get(url)

    soup = bs(req.text,"html.parser")
    coffees = soup.find_all("div",class_="col-md-4 col-sm-12 col-xs-12")
    for coffee in coffees:
        name = coffee.find("div",class_="product-details-main").find("ul",class_="uk-breadcrumb uk-text-uppercase").span.text
        roast = coffee.find("div",class_="uk-flex uk-flex-middle uk-width-1-1 coff_type_main").find("p",class_="coff_type uk-margin-small-left uk-text-uppercase").text.split("|")[0]
        
        print(name,roast)

    # Find the JavaScript declaration (there is only one `meta` variable, so no chance of ambiguity)
    json_start = req.text.find("var meta = ") + len("var meta = ")
    # Find the end of the JavaScript object (there won't be any `;` inside)
    json_end = req.text.find(";",json_start) 
    json_str = req.text[json_start:json_end]
    json_data = json.loads(json_str)

    # Get the prices from the JSON object
    product = json_data["product"]
    variants = product["variants"]
    for variant in variants:
        print(f'Variant: {variant["name"]}, price: {variant["price"]}')
    
    print("\n")

我希望这会有所帮助,干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2022-01-08
    • 2020-03-10
    • 2016-02-06
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多