解析BeautifulSoup中select下的所有选项

时间:2015-07-20 07:55:50

标签: python python-2.7 web-scraping beautifulsoup mechanize

我有一个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'

申请帮助:)

4 个答案:

答案 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