选择使用请求python

时间:2017-10-10 08:49:07

标签: python beautifulsoup python-requests

使用BeautifulSoup和请求:

输入:

select_object=soup.find('select',{'id':'limit'})
print(select_object)

输出:

<select id="limit" name="limit" class="inputbox" size="1" onchange="this.form.submit()">
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20" selected="selected">20</option>
<option value="25">25</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="0">All</option>

我需要做的是移动选择=&#34;选择&#34;到最后一个选项,全部。

我尝试了什么:

for item in select_object:
    if str(item) == '<option selected="selected" value="20">20</option>':
        item.replace_with('<option value="20">20</option>')
    if str(item) == '<option value="0">All</option>':
        item.replace_with('<option selected="selected" value="0">All</option>')
request=requests.post(url,params=select_object)
soup=BeautifulSoup(request.content)

以上不起作用,因为而不是&lt;和&gt;我得到&amp; lt

我也尝试过:

for item in select_object:
    if str(item) == '<option selected="selected" value="20">20</option>':
        new_tag2=BeautifulSoup('<option value="20">20</option>')
        new_tag2=new_tag2.html.body.contents[0]
        item.replace_with(new_tag2)
    if str(item) == '<option value="0">All</option>':
        newtag2=BeautifulSoup('<option selected="selected" value="0">All</option>')
        newtag2=newtag2.html.body.contents[0]
        item.replace_with(newtag2) value="0">All</option>')
request=requests.post(url,params=select_object)
soup=BeautifulSoup(request.content)

这样做,如果我再次搜索选择项目它是正确的,但页面没有变化,我只获得前20个结果,而不是获得所有结果。 有任何想法吗? 我认为我没有正确发布或者可能有更简单的方法。 我不认为params = select_object是对的但是......

2 个答案:

答案 0 :(得分:3)

replace_with将转义字符串,但它也会收到一个标记,以便您可以使用:

new_tag = BeautifulSoup('<option value="20">20</option>').option
item.replace_with(new_tag)

如果您只想更改属性,则可以更直接地操作它:

for item in select_object:
    if str(item) == '<option selected="selected" value="20">20</option>':
        del item['selected']
    if str(item) == '<option value="0">All</option>':
        item['selected'] = 'selected'

更新

您需要发送包含表单数据的帖子请求,您需要获取网址并准备数据。类似的东西:

# get the url
action = soup.find('form', ...).get('action')
post_url = get_post_url(host, action)

# parse the html and prepare the form
form = {'limit': '0', ...}

# send post request the form data
response = requests.post(post_url, data=form)

答案 1 :(得分:0)

对于“发布”,您应该使用“数据”而不是“参数”。将“参数”用作“获取”。