使用 urllib 从下拉列表中选择
Selecting from dropdown list using urllib
我想从 .aspx
页面的下拉列表中 select 一个项目,然后单击一个按钮。然后根据下拉列表中的值更新 table。当下拉列表中的项目被 select 编辑时,它会添加 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>
有没有办法点击这个select下拉列表中的一个值,点击按钮,然后使用urllib、urllib2或urllib3获取table中的数据?或者我需要使用机械化之类的东西吗?
我建议首先打印 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
我刚才遇到了与您类似的问题,为此编写了这个小脚本。我已经修改了名称以匹配您的示例。
# 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 是 table 的 html,因此您可以使用 Pandas 之类的东西进行操作或使用 [=19] 进行任何其他操作=].根据机器的不同,您可能需要添加一些 sleep
语句来等待 table 加载。
我想从 .aspx
页面的下拉列表中 select 一个项目,然后单击一个按钮。然后根据下拉列表中的值更新 table。当下拉列表中的项目被 select 编辑时,它会添加 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>
有没有办法点击这个select下拉列表中的一个值,点击按钮,然后使用urllib、urllib2或urllib3获取table中的数据?或者我需要使用机械化之类的东西吗?
我建议首先打印 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
我刚才遇到了与您类似的问题,为此编写了这个小脚本。我已经修改了名称以匹配您的示例。
# 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 是 table 的 html,因此您可以使用 Pandas 之类的东西进行操作或使用 [=19] 进行任何其他操作=].根据机器的不同,您可能需要添加一些 sleep
语句来等待 table 加载。