python - BS4 从具有相同类的不同 div 中获取值(value)

标签 python beautifulsoup

我正在尝试抓取一个有两种价格类型的网站,正常价格和折扣价格。
正常价格 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/

相关文章:

php - 安装linux raspberry的mysql-server失败(没有剩余空间)

Python正则表达式查找不完整的左括号和右括号

python - 基本的 Python/Beautiful Soup 解析

python - 我在解析网页中的表格时遇到问题

python - 如何通过路径访问元素?

python - 在 python 的两层循环中使用相同的变量时发生了什么?

python - 按访问权限对用户群体进行分类

python - 为什么从过滤器创建集合比创建列表或元组快得多?

python - AttributeError : 'unicode' object has no attribute 'fromstring' . 如何解决这个问题?

python - BeautifulSoup 无法读取 html