使用urllib从下拉列表中选择

时间:2016-03-07 17:07:42

标签: python urllib2 mechanize urllib

我想从.aspx页面的下拉列表中选择一个项目,然后点击一个按钮。然后根据下拉列表中的值更新表。选择下拉列表中的项目后,会在其上添加selected="selected"

<form method="post" action="page.aspx" id="aspnetForm">
    <div id="div1">
        <select name="DropDownList" id="DropDownList1">

            <option selected="selected" value="foo">foo</option>
            ...
            <option value="bar">bar</option>
            <option value="foobar">foobar</option>

        </select>
        <input type="submit" name="Button" value="Submit Value" id="Button1">
    </div>
    <div id="div2">
        <table id="table1" name="Table">
            <tbody>.
                <tr>...</tr>
                ...
                <tr>...</tr>
            </tbody>
        </table>
    </div>
</form>

有没有办法点击这个选择下拉列表中的值,单击按钮,然后使用urllib,urllib2或urllib3获取表中的数据?或者我需要使用像机械化这样的东西吗?

2 个答案:

答案 0 :(得分:1)

我前段时间遇到了类似的问题并编写了这个小脚本。我已修改名称以符合您的示例。

# Setup
dropdown_id = 'DropDownList1'
button_id = 'Button1'
table_id = 'table1'
browser = webdriver.Chrome('C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe')
browser.get(url)

# Data getting
dropdown = _browser.find_element_by_id(dropdown_id)
for option in dropdown.dropdown.find_elements_by_tag_name('option'):
    select = Select(browser.find_element_by_id(dropdown_id))
    select.select_by_value(option.text)
    button = browser.find_element_by_id(button_id)
    button.click()
    table = browser.find_element_by_id(table_id)
    html = table.get_attribute('outerHTML')
browser.close()

如图所示,html是表格的html,因此您可以使用Pandas或其他任何操作来操纵该表格。根据计算机的不同,您可能需要添加一些sleep语句以等待表加载。

答案 1 :(得分:0)

我建议先打印html表格中的值。

Mechanize有一个很好的结构来填充html表单。

例如:

import mechanize
from bs4 import BeautifulSoup

# Read url with Mechanize
url = 'https://example.com/'
br = mechanize.Browser()
br.open(url)
# Browser options
br.set_handle_redirect(True)
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Firefox')]

for form in br.forms():
    print "Form name: ", form.name
    br.select_form(nr=0) # nr=0 It selects html form without name

    for control in br.form.controls:
        print control
        print "type=%s, name=%s value=%s" % (control.type, control.name, br[control.name])

用mechanize检查html表单结构后:

br.select_form(nr=0)
br.form['DropDownList'] = ['InsertValue']
response = br.submit()
search = response.read()
print search