我正在尝试抓取一个有两种价格类型的网站,正常价格和折扣价格。
正常价格 HTML:
<p class="plp__price__325EX">
<span aria-label="$29.99">$29.99</span>
</p>
折扣价 HTML:<p class="plp__price__325EX plp__salePrice__2ExZ2 plp__price__325EX">
$11.99 // trying to get this price
<span class="plp__priceStrikeThrough__2MAlQ plp__price__325EX">$15.99</span>
</p>
正常价格代码:try:
normal_price_element = item.find('p', {'class', 'plp__price__325EX'})
normal_price = normal_price_element.find('span').text
except:
normal_price = ''
优惠价格代码:try:
disc_price = item.find('p', {'class', 'plp__salePrice__2ExZ2'}).text
except:
disc_price = ''
这些代码片段之间的唯一区别是类名。问题在于p
中的span类包含 plp__price__325EX
所以正常价格代码将在不应该运行时运行并获得正常价格而不是折扣价。
最佳答案
假设你有这个文件:
from bs4 import BeautifulSoup
html_doc = """
<p class="plp__price__325EX plp__salePrice__2ExZ2 plp__price__325EX">
$11.99
<span class="plp__priceStrikeThrough__2MAlQ plp__price__325EX">$15.99</span>
</p>
<p class="plp__price__325EX">
<span aria-label="$29.99">$29.99</span>
</p>"""
soup = BeautifulSoup(html_doc, "html.parser")
然后你可以使用 lambda 函数来定位 <p>
只包含一个类的标签 plp__price__325EX
:# find <p> tag that contains only *ONE* class="plp__price__325EX"
normal_price = soup.find(
lambda tag: tag.name == "p"
and tag.get("class", []) == ["plp__price__325EX"]
)
dis_price = soup.find("p", class_="plp__salePrice__2ExZ2")
print(normal_price.get_text(strip=True))
print(dis_price.contents[0].strip())
打印:$29.99
$11.99
或者你可以使用 CSS 选择器:
normal_price = soup.select_one(
"p.plp__price__325EX:has(>[aria-label])"
).text.strip()
dis_price = soup.select_one("p.plp__salePrice__2ExZ2").text.split()[0]
print(normal_price)
print(dis_price)
打印:$29.99
$11.99
关于python - BS4 从具有相同类的不同 div 中获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66809018/