使用BeautifulSoup查找选定选项

18 投票
2 回答
23878 浏览
提问于 2025-04-17 15:48

我想只获取下拉框中被选中的选项。例如:

<select>
  <option value="0">2002/12</option>
  <option value="1">2003/12</option>
  <option value="2">2004/12</option>
  <option value="3">2005/12</option>
  <option value="4">2006/12</option>
  <option value="5" selected>2007/12</option>
</select>

我知道我可以这样做:

theSelectTag.findAll('option',attrs={'selected':''})

但是这样会返回所有的选项。有没有办法只获取那些带有某个属性的元素?请注意,我问的是所有,因为我正在抓取的网站中,多个选项都包含了被选中的属性。

我使用的是Python 2.7和Beautiful Soup 4.1.2。

2 个回答

6

你可以使用

theSelectTag.select_one('option:checked')

这样做会返回你唯一选择的那个选项。

17

True 作为属性的值传入,就会匹配所有带有那个属性的元素:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''<select>
...   <option value="0">2002/12</option>
...   <option value="1">2003/12</option>
...   <option value="2">2004/12</option>
...   <option value="3">2005/12</option>
...   <option value="4">2006/12</option>
...   <option value="5" selected>2007/12</option>
... </select>''')
>>> soup.find_all('option', selected=True)
    [<option selected="" value="5">2007/12</option>]
>>> soup.find_all('option', {'selected': True})
    [<option selected="" value="5">2007/12</option>]

如果使用 lxml 的话:

>>> from lxml import etree
>>> root = etree.HTML('''<select>
  <option value="0">2002/12</option>
  <option value="1">2003/12</option>
  <option value="2">2004/12</option>
  <option value="3">2005/12</option>
  <option value="4">2006/12</option>
  <option value="5" selected>2007/12</option>
</select>''')
>>> root.xpath('//option[@selected]')
    [<Element option at 0x228b7d0>]

撰写回答