【问题标题】:How to select value from dropdown item using requests in Python 3?如何使用 Python 3 中的请求从下拉项中选择值?
【发布时间】:2019-06-11 17:21:49
【问题描述】:

我想从网站https://xlnindia.gov.in/frm_G_Cold_S_Query.aspx 抓取数据。我必须选择 State 作为 DelhiDistrict 作为 Adarsh Nagar (4) 并点击 搜索按钮,并抓取所有信息。

到目前为止,我尝试使用下面给出的代码

import requests
from bs4 import BeautifulSoup

错误是“HTTPS 443 SSL”,我使用“verify = False

解决了这个问题
resp = requests.get('https://xlnindia.gov.in/frm_G_Cold_S_Query.aspx',verify=False)
soup = BeautifulSoup(resp.text,"lxml")

dictinfo = {i['name']:i.get('value','') for i in soup.select('input[name]')}
dictinfo['ddlState']='Delhi'
dictinfo['ddldistrict']='Adarsh Nagar (4)'
dictinfo['__EVENTTARGET']='btnSearch'
dictinfo = {k:(None,str(v)) for k,v in dictinfo.items()}
r=requests.post('https://xlnindia.gov.in/frm_G_Cold_S_Query.aspx',verify=False,files=dictinfo)
r

错误:响应 [500]

汤2

错误: 无效的回发或回调 争论。使用 在配置或 在页面中。出于安全目的, 此功能验证回发或回调事件的参数 源自最初呈现它们的服务器控件。如果 数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法,以便 注册回发或回调数据以进行验证。

谁能帮我把它刮掉或完成它。

我只能使用 REQUESTBEAUTIFULSOUP 库,没有 SELENIUM、MECHANIZE 等库。

【问题讨论】:

  • 你为什么要将字典作为文件发送?
  • 你可能还需要一些标题
  • 另外ddlState对应'DL'在使用浏览器时,再次检查您的输入
  • @SuperStew - 嗨 Stew,实际上我是 Requests 库的新手,在这种情况下我通常更喜欢 Selenium。我从链接how to pass parameter 中找到的。我尝试使用它,但它似乎不起作用。我在选择状态时看到了 javascript post 方法并发现使用了“ddlState”变量,所以我将该变量用作 dict 参数来发布请求库的方法。
  • 检查您不需要执行至少两个单独的 POST 请求,因为我在选择德里后立即看到初始 POST 请求。如果是这样,请使用 Session 从第一个 POST 中传递 cookie。

标签: python web-scraping beautifulsoup request python-requests


【解决方案1】:

尝试使用下面的脚本来获取要填充的表格结果,从该网页中选择上面所述的两个下拉项。事实证明,您必须发出两个后续的发布请求才能填充结果。

import requests
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = 'https://xlnindia.gov.in/frm_G_Cold_S_Query.aspx'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0'
    resp = s.get(url,verify=False)
    soup = BeautifulSoup(resp.text,"lxml")

    dictinfo = {i['name']:i.get('value','') for i in soup.select('input[name]')}
    dictinfo['ddlState'] = 'DL'

    res = s.post(url,data=dictinfo)
    soup_obj = BeautifulSoup(res.text,"lxml")

    payload = {i['name']:i.get('value','') for i in soup_obj.select('input[name]')}
    payload['ddldistrict'] = 'ADN'

    r = s.post(url,data=payload)
    sauce = BeautifulSoup(r.text,"lxml")
    for items in sauce.select("#dgDisplay tr"):
        data = [item.get_text(strip=True) for item in items.select("td")]
        print(data)

您可能会在控制台中看到如下输出:

['Firm Name', 'City', 'Licences', 'Reg. Pharmacists / Comp. Person']
['A ONE MEDICOS', 'DELHI-251/1, GALI NO.1, KH, NO, 739/251/1, NEAR HIMACHAL BHAWAN,SARAI PIPAL THALA, VILLAGE AZAD PUR,', 'R - 2', 'virender kumar, DPH, [22295-17/10/2013]']
['AAROGYAM', 'DELHI-PVT. SHOP NO. 1, GF, 121,VILLAGE BHAROLA', 'R - 2', 'avinesh bhadoriya, DPH, [27033-]']
['ABCO INDIA', 'DELHI-SHOP NO-452/22,BHUSHAN BHAWAN RING ROAD,FLYOVER AZAD PUR', 'W - 2', 'sanjay dubey , SSC, [C-P-03/01/1997]']
['ADARSH MEDICOS', 'DELHI-NORTHERN SIDE B-107, GALI NO. 1,,MAJLIS PARK, VILLAGE BHAROLA,', 'R - 2', 'dilip kumar, BPH, [28036-11/01/2018]']

【讨论】:

  • 你不是在有效载荷字典中指定搜索按钮吗,虽然输出即将到来但仍然如网页中一样,输出表仅在单击搜索按钮后显示......
  • 如果你打印payload,你可以看到这个'btnSearch': 'Search'已经存在了。您不需要明确指定它。谢谢。
  • 感谢 SIM,最后一个问题,我在代码的请求方法中将“数据”参数替换为“文件”。然后它不显示输出,但如果使用了您在代码中执行的“数据”参数,它会显示。据我所知,两者都用于接受字典参数。那么,'files' 参数如何不起作用...
  • 不,你不能那样做。当使用get 请求时,你应该使用params=anything,当你使用post 请求时,它应该是data=anythinganything 表示您可以使用的任何名称。
  • 实际上链接中有答案(stackoverflow.com/questions/56481600/…)类似于这个问题,其中我使用了'files'参数并且它正在工作。
猜你喜欢
  • 2014-04-26
  • 2015-08-30
  • 2019-02-08
  • 2016-07-28
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多