我对这个脚本的想法是制作一个可以打印出以下内容的脚本
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>
答案 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:]
切片。