关键字/属性(Python)的美丽汤过滤



我想使用美丽的汤和请求来刮擦网站的数据,但我几乎得到了我想要的东西,但是我找不到一种过滤最后一步的方法:

这是我的代码:

variants = soup.find('div', class_='product-configure')
print(variants)

这将打印以下内容:

<div class="product-configure">
<select id="custom-variants">
<option disabled="disabled" selected="selected">Maak een keuze</option>
<option data-status="available" data-value="177379037">Size : EU 40.5 (US 7) 
</option>
<option data-status="available" data-value="177379043">Size : EU 41.5 (US 8) 
</option>
<option data-status="available" data-value="177379223">Size : EU 42.5 (US 9) 
</option>
</select>
</div>

如何过滤它,以便它仅在"数据值"中打印所有数字?(例如" 177379037"作为第一行的输出)

这是html:

          <div class="gui-select">
                  <div class="product-configure">
                        <select id="custom-variants">
            <option selected="selected" disabled="disabled">Select an option</option>
                            <option data-value="177379037" data-status="available">Size : EU 40.5 (US 7)</option>
                            <option data-value="177379043" data-status="available">Size : EU 41.5 (US 8)</option>
                            <option data-value="177379223" data-status="available">Size : EU 42.5 (US 9)</option>

        </div>

您可以使用soup.find_all()并使用具有属性的dict

options = soup.find_all("option", {"data-value": True})

结果:

for o in options:
    print(o.attrs["data-value"])

177379037
177379043
177379223

您可以使用属性CSS选择器

使用类
items = [item['data-value'] for item in soup.select('.product-configure [data-value]')]

如果只有一个类要考虑您可以使用ID

items = [item['data-value'] for item in soup.select('#custom-variants [data-value]')]

您使用find_all获取所有<option>标签,然后打印出data-value属性。请注意,并非所有option标签都具有该属性,因此我在没有data-value的情况下将try放在那里继续。

html = '''         <div class="gui-select">
                  <div class="product-configure">
                        <select id="custom-variants">
            <option selected="selected" disabled="disabled">Select an option</option>
                            <option data-value="177379037" data-status="available">Size : EU 40.5 (US 7)</option>
                            <option data-value="177379043" data-status="available">Size : EU 41.5 (US 8)</option>
                            <option data-value="177379223" data-status="available">Size : EU 42.5 (US 9)</option>

        </div>'''
import bs4
soup = bs4.BeautifulSoup(html, 'html.parser')
elem = soup.find_all('option')
for each in elem:
    try:
        print (each['data-value'])
    except:
        continue

输出:

177379037
177379043
177379223

最新更新