首页 > 解决方案 > 在 BS4 Python 上选择特定标签

问题描述

我有以下 HTML

 <li class="product-size__option-wrapper">
            <a onclick="ACC.productDetail.getNewProductSize(this)" data-option-code="000000000196428006" class="product-size__option">
    
                I WANT THIS</a>
        </li>
    <li class="product-size__option-wrapper">
            <a onclick="ACC.productDetail.getNewProductSize(this)" data-option-code="000000000196428007" class="product-size__option product-size__option--no-stock">
    
                I DONT WANT THIS</a>
        </li>
<li class="product-size__option-wrapper">
            <a onclick="ACC.productDetail.getNewProductSize(this)" data-option-code="000000000196428006" class="product-size__option">
    
                I WANT THIS</a>
        </li>

我使用此代码来获取数据

linksize =soup.find_all('li', class_='product-size__option-wrapper')
            productsize = []
            for size in linksize:
                for size_available in size.find_all('a', {'class':['product-size__option']}):
                    productsize.append(size_available.text.strip())

但是它得到了两个标签,因为它共享同一个类(product-size__option),我怎样才能只获得我需要的信息?

谢谢

标签: pythonbeautifulsoup

解决方案


你不想要的数据有一个 CSS 类product-size__option--no-stock。您可以通过执行以下检查来检查元素是否不包含此类:if 'product-size__option--no-stock' not in size_available.attrs['class']

例如:

from bs4 import BeautifulSoup

html = '''<li class="product-size__option-wrapper">
        <a onclick="ACC.productDetail.getNewProductSize(this)" data-option-code="000000000196428006" class="product-size__option">

            I WANT THIS</a>
    </li>
<li class="product-size__option-wrapper">
        <a onclick="ACC.productDetail.getNewProductSize(this)" data-option-code="000000000196428007" class="product-size__option product-size__option--no-stock">

            I DONT WANT THIS</a>
    </li>'''

    
soup = BeautifulSoup(html,  'html.parser')

linksize =soup.find_all('li', class_='product-size__option-wrapper')
productsize = []
for size in linksize:
    for size_available in size.find_all('a', {'class':['product-size__option']}):
        if 'product-size__option--no-stock' not in size_available.attrs['class']:
            productsize.append(size_available.text.strip())

推荐阅读