我有一个HTML,每个选择标记下都有多个选择标记和多个下拉选项 我想解析每个选择下的所有选项并存储它们
这就是html的样子
<select name="primary_select">
<option></option>
<option></option>
</select>
<select name="secondary_select">
<option></option>
<option></option>
</select>
这就是我的代码的样子
我在python中使用beautifulsoup和mechanize
soup = BeautifulSoup(response.get_data())
subject_options = soup.findAll('select', attrs = {'name': 'primary_select'} ).findAll("option")
print subject_options
我收到以下错误
AttributeError: 'ResultSet' object has no attribute 'findAll'
申请帮助:)
答案 0 :(得分:2)
findAll
会返回一个列表,您无法直接应用其他findAll。
from bs4 import BeautifulSoup
html = '''<select name="primary_select">
<option></option>
<option></option>
</select>
<select name="secondary_select">
<option></option>
<option></option>
</select>'''
soup = BeautifulSoup(html)
subject_options = [i.findAll('option') for i in soup.findAll('select', attrs = {'name': 'primary_select'} )]
print subject_options
输出:
[[<option></option>, <option></option>]]
或者
使用css选择器。
soup = BeautifulSoup(html)
subject_options = soup.select('select[name=primary_select] > option')
print subject_options
我想解析每个选择下的所有选项并存储它们。
subject_options = soup.select('select > option')
print subject_options
<强>输出:强>
[<option></option>, <option></option>, <option></option>, <option></option>]
答案 1 :(得分:1)
是的,ResultSet
没有属性findAll
...
这应该有效:
subject_options = [
r.findAll('option')
for r in soup.findAll('select', attrs = {'name': 'primary_select'} )
]
但是你为什么不从一开始就做一个选项来获得选项呢?
subject_options = soup.findAll(
lambda t: t.name == 'option' and t.parent.attrs.get('name') == 'primary_select'
)
答案 2 :(得分:0)
一个简单的修改就解决了这个问题
我只需添加一个[0],因为它提供了符合条件
的所有元素的列表感谢您的帮助:)
subject_options = soup.findAll('select', attrs = {'name': 'primary_select'} )[0].findAll("option")
答案 3 :(得分:0)
感谢紧凑型脚本
要获取所选选项的实际值,我发现它可以与.getText()函数配合使用,以防有人也想扩展它。
代码:
subject_options = soup.select('select[aria-label=Seitenauswahl] > option')
for i in subject_options:
print(i.getText())
max_pagnation=subject_options[-1].getText()
print("Max=" + max_pagnation)
输出
1
2
3
Max=3