如何删除bs4选择的选项?

时间:2018-08-29 12:36:22

标签: python beautifulsoup

我对这个脚本的想法是制作一个可以打印出以下内容的脚本

4,5 5,5 6 7 8,5 9 10

使用以下HTML格式:

<select name="id" style="display: none;">
   <option value="-1" class="selected">
      Choose number
   </option>
   <option value="5011265">
      4,5
   </option>
   <option data-alt="1 kvar" value="5012834">
      5,5
   </option>
   <option value="5011266">
      6
   </option>
   <option value="5011267">
      7
   </option>
   <option data-alt="1 kvar" value="5011269">
      8,5
   </option>
   <option value="5011270">
      9
   </option>
   <option value="5011271">
      10
   </option>
</select>

我设法使用

打印
nosto_sku_tags = bs4.find_all('select', {'name': 'id'})

    product_skus = []
    for nosto_sku_tag in nosto_sku_tags:

        try:
            sku_size = nosto_sku_tag
            print(sku_size)

        except Exception:
            sku_size = None

但是我得到的打印件是:

          选择号码               4,5               5,5               6               7               8.5               9               10    

而且我不知道如何继续编写代码,因此它只会打印出所有数字,而不会打印出第一个数字Choose number

如何制作代码,以便仅打印数字而不包含Choose number

立即打印时打印出结果:

<select name="id">
   <option value="-1">
      Choose number
   </option>
   <option value="5011265">
      4,5
   </option>
   <option data-alt="1 kvar" value="5012834">
      5,5
   </option>
   <option value="5011266">
      6
   </option>
   <option value="5011267">
      7
   </option>
   <option data-alt="1 kvar" value="5011269">
      8,5
   </option>
   <option value="5011270">
      9
   </option>
   <option value="5011271">
      10
   </option>
</select>

1 个答案:

答案 0 :(得分:1)

如果“选中”是指第一个具有selected class ,则可以对此进行简单测试:

nosto_sku_tags = bs4.select('select[name="id"] option')
for nosto_sku_tag in nosto_sku_tags:
    if 'selected' in nosto_sku_tag.get('class', ()):
        continue
    sku_size = nosto_sku_tag.get_text(strip=True)

(在这种情况下,实际上不需要使用异常处理,所有标记都具有get_text()方法)。

由于class属性可能缺失,因此在这种情况下,您需要使用.get('class', ())来获取一个空元组。

请注意,我使用了不同查询来查找您在HTML中发布的<option>元素。您的代码将<select>元素打印为一个大对象,而不是其下面的单个<option>元素。我使用CSS selector直接转到选项,而不是对<select>元素然后包含的<option>元素进行单独搜索。

BeautifulSoup CSS选择器代码并不十分复杂,因此我们无法使用:not(.selected)伪选择器来过滤该选项。

演示:

>>> nosto_sku_tags = soup.select('select[name="id"] option')
>>> for nosto_sku_tag in nosto_sku_tags:
...     if 'selected' in nosto_sku_tag.get('class', ()):
...         continue
...     sku_size = nosto_sku_tag.get_text(strip=True)
...     print(sku_size)
...
4,5
5,5
6
7
8,5
9
10

如果<option>元素上没有没有类,并且也没有selected属性,那么您将不得不提出自己的启发式方法。默认情况下, first 元素是浏览器中可见的元素,因此我们可以跳过该元素:

for nosto_sku_tag in nosto_sku_tags[1:]:
    sku_size = nosto_sku_tag.get_text(strip=True)

请注意[1:]切片。