Коллекция поиска по имени и значению, загруженная из выпадающего списка с помощью Beautifulsoup - PullRequest
0 голосов
/ 31 июля 2010

На моей html-странице у меня есть выпадающий список:

<select name="somelist">
   <option value="234234234239393">Some Text</option>
</select>

Итак, получите этот список, которым я занимаюсь:

ddl = soup.findAll('select', name="somelist")

if(ddl):
    ???

Теперь мне нужна помощь с этой коллекцией / словарем,Я хочу иметь возможность поиска по какому-нибудь тексту и 234234234239393.

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 31 июля 2010

Для начала попробуйте следующее:

str = r'''
<select name="somelist">
   <option value="234234234239393">Some Text</option>
   <option value="42">Other text</option>
</select>
'''

soup = BeautifulSoup(str)
select_node = soup.findAll('select', attrs={'name': 'somelist'})

if select_node:
    for option in select_node[0].findAll('option'):
        print option

Распечатывает option узлы:

<option value="234234234239393">Some Text</option>
<option value="42">Other text</option>

Теперь для каждого option, option['value'] является атрибутом значения, а option.text является текстом внутри тега («Some Text»)

1 голос
/ 31 июля 2010

Вот один из способов ..

ddl_list = soup.findAll('select', attrs={'name': 'somelist'})
if ddl_list:
    ddl = ddl_list[0]

    # find the optino by value=234234234239393
    opt = ddl.findChild('option', attrs={'value': '234234234239393'})
    if opt:
        # do something

    # this list will hold all "option" elements matching 'Some Text'
    opt_list = [opt for opt in ddl.findChildren('option') if opt.string == u'Some Text']
    if opt_list:
        opt2 = opt_list[0]
        # do something
0 голосов
/ 31 июля 2010

И снова, просто чтобы показать, как можно сделать это с помощью pyparsing:

html = r''' 
<select name="somelist"> 
   <option value="234234234239393">Some Text</option> 
   <option value="42">Other text</option> 
</select> 
''' 

from pyparsing import makeHTMLTags, Group, SkipTo, withAttribute, OneOrMore

select,selectEnd = makeHTMLTags("SELECT")
option,optionEnd = makeHTMLTags("OPTION")

optionEntry = Group(option("option") + 
                    SkipTo(optionEnd)("menutext") + 
                    optionEnd)

somelistSelect = (select.setParseAction(withAttribute(name="somelist")) +
                    OneOrMore(optionEntry)("options") +
                    selectEnd)

t,_,_ = somelistSelect.scanString(html).next()

for op in t.options:
    print op.menutext, '->', op.option.value

печатает:

Some Text -> 234234234239393
Other text -> 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...