如何使用 BeautifulSoup 在 HTML 中提取折扣价
Posted
技术标签:
【中文标题】如何使用 BeautifulSoup 在 HTML 中提取折扣价【英文标题】:How to extract discounted prices in HTML using BeautifulSoup 【发布时间】:2021-10-24 21:39:44 【问题描述】:我正在尝试练习和学习 BeautifulSoup,所以我尝试在网上商店解析网页。但是,我无法提取某些价格,因为它们在 html 中有两个价格——原价和折扣价。更重要的是,它们在同一个 div 类和 span 类下。
完整的 HTML 链接在这里:https://www.parkoutlet.com.ph/collections/mens-footwear?page=1
如果当前页面没有售罄或折扣价,您可以滚动查看其他页面。
HTML Code Here
这是我当前的代码:
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
url = "https://www.parkoutlet.com.ph/collections/mens-footwear"
# Opening the URL
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
itemContainers = soup.findAll("div", "class":"grid__item small--one-half medium-up--one-fifth") # Finds all the "Shoe Containers"
for container in itemContainers:
brandContainer = container.findAll("div", class_="product-card__brand") # Brand Name
brand = brandContainer[0].text
nameContainer = container.findAll("div", class_="product-card__name") # Product Name
name = nameContainer[0].text
try:
priceContainer = container.findAll("s", class_="product-card__regular-price") # Regular Price
priceAvail = priceContainer[0].text
print(priceAvail)
except:
noStock = container.findAll("div", class_="product-card__availability") # Sold Out
print("SOLD OUT")
print(brand)
print(name)
print("")
它给了我
₱2,495
NIKE
NIKE JR. MERCURIAL VAPOR 13 CLUB NEYMAR JR. TURF (YOUTH)
₱2,495
NIKE
NIKE JR. MERCURIAL VAPOR 13 CLUB NEYMAR JR. MG (YOUTH)
₱2,495
NIKE
NIKE JR. PHANTOM VISION 2 CLUB DYNAMIC FIT FG/MG (YOUTH)
SOLD OUT
NIKE
NIKE MERCURIAL VAPOR 13 CLUB NEYMAR JR. TURF
₱4,300
ADIDAS
ADIDAS X 19 3 FIRM GROUND BOOTS
SOLD OUT
NIKE
NIKE PHANTOM VISION 2 ACADEMY DYNAMIC FIT IC
SOLD OUT
NIKE
NIKE DAY BREAK MENS SHOE
₱5,795
NIKE
PG 4 EP BASKETBALL MENS SHOE
SOLD OUT
NIKE
PG 4 EP BASKETBALL MENS SHOE
SOLD OUT
NIKE
PG4 EP MENS BASKETBALL SHOE
₱5,795
NIKE
PG4 EP MENS BASKETBALL SHOE
₱5,795
NIKE
PG 4 PCG EP BASKETBALL MENS SHOE
₱5,795
NIKE
PG 4 PCG EP BASKETBALL MENS SHOE
₱6,445
NIKE
NIKE ZOOM FREAK 2
SOLD OUT
NIKE
NIKE AIR PRESTO MENS SHOE
SOLD OUT
NIKE
JORDAN DELTA MENS SHOE
SOLD OUT
NIKE
JORDAN DELTA MENS SHOE
SOLD OUT
NIKE
KYBRID S2 EP BASKETBALL MENS SHOE
SOLD OUT
NIKE
KYBRID S2 EP BASKETBALL MENS SHOE
SOLD OUT
NIKE
NIKE AIR MAX 2090 MENS SHOE
是的。品牌名称和商品名称都正确,但价格不正确。例如,第一件商品的价格应该是 P749,因为那是折扣价。
我目前是初学者,如果您在我的代码中看到任何错误,除了无法获得折扣价,请告诉我!
1.) 我如何在原价处于相同 div 和 class 的情况下获得折扣价
2.) 我怎样才能让我的代码更有效率?有没有更好的方法来处理这个项目?
【问题讨论】:
【参考方案1】:您可以使用此示例获取正常价格/销售价格/可用性:
import requests
from bs4 import BeautifulSoup
url = "https://www.parkoutlet.com.ph/collections/mens-footwear?page=1"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
for item in soup.select(".grid__item.medium-up--one-fifth"):
brand = item.select_one(".product-card__brand")
name = item.select_one(".product-card__name")
sale_price = ""
normal_price = item.select_one(".product-card__regular-price")
if normal_price:
sale_price = normal_price.find_next().find_next_sibling(text=True)
else:
normal_price = item.select_one(".product-card__availability")
print(brand.get_text(strip=True))
print(name.get_text(strip=True))
print(normal_price.get_text(strip=True))
print(sale_price.strip())
print("-" * 80)
打印:
NIKE
NIKE JR. MERCURIAL VAPOR 13 CLUB NEYMAR JR. TURF (YOUTH)
₱2,495
₱749
--------------------------------------------------------------------------------
NIKE
NIKE JR. MERCURIAL VAPOR 13 CLUB NEYMAR JR. MG (YOUTH)
₱2,495
₱749
--------------------------------------------------------------------------------
NIKE
NIKE JR. PHANTOM VISION 2 CLUB DYNAMIC FIT FG/MG (YOUTH)
₱2,495
₱749
--------------------------------------------------------------------------------
...
【讨论】:
感谢您提供这个清晰的解决方案!我有几个问题:1.) findAll 和 find 是否分别具有相同的 select 和 select_one 用例? 2.)if normal_price:
的条件是什么?我习惯于在 if 语句之后看到诸如“is”或表达式之类的条件,我完全无法弄清楚它的条件。 3.) 如果 - 如果有折扣价:仅返回折扣价,您将如何解决该问题
@RaphaelRamirez 对于.select
和.select_one
,您可以使用CSS 选择器,而.find
/.find_all
则不是这样。如果sale_price != ""
有折扣,所以您可以退回该价格而不是正常价格。以上是关于如何使用 BeautifulSoup 在 HTML 中提取折扣价的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 BeautifulSoup 保存对 HTML 文件所做的更改?
如何使用 BeautifulSoup 从 HTML 中去除评论标签?
如何使用 BeautifulSoup 在 HTML 中处理不同的相同类
如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串? [复制]