需要废弃使用python(selenium)通过ajax加载的表

2024-06-25 06:06:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个page,它有一个表(table id=“ctl00_ContentPlaceHolder_ctl00_ctl00_GV”^{cl1}$

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.get(url)
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located(By.CSS_SELECTOR, 'table#ctl00_ContentPlaceHolder_ctl00_ctl00_GV'))

上面的代码没有给出表中所需的内容。 我该如何实现这个目标???在


Tags: fromimportsupportbydriverseleniumpagetable
2条回答

如果你想删除一些东西,最好先安装一个web调试器(例如,Firebug代表Mozilla Firefox)来观察你想要删除的网站是如何工作的。在

接下来,您需要复制网站如何连接到backoffice的过程

正如您所说,您要废弃的内容是异步加载的(仅当文档准备好时)

假设调试器正在运行,并且您已经刷新了页面,您将在“网络”选项卡上看到以下请求:

https://seahawks.strmarketplace.com/Charter-Seat-Licenses/Charter-Seat-Licenses.aspx

实现目标的最终流程是:

  • 1/使用requests python module
  • 2/打开索引页网站的请求会话(使用Cookie处理)
  • 3/废弃特定POST表单请求的所有输入
  • 4/构建一个POST parameter DICT,其中包含在上一步中废弃的所有输入和值字段+添加一些特定的固定参数。在
  • 5/发布请求(带所需数据)
  • {6)像往常一样使用你的数据

请参见以下工作代码:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from bs4 import BeautifulSoup
import requests

base_url="https://seahawks.strmarketplace.com/Charter-Seat-Licenses/Charter-Seat-Licenses.aspx"

#create requests session
s = requests.session()

#get index page
r=s.get(base_url)

#soup page
bs=BeautifulSoup(r.text)

#extract FORM html
form_soup= bs.find('form',{'name':'aspnetForm'})

#extracting all inputs
input_div = form_soup.findAll("input")

#build the data parameters for POST request
#we add some required <fixed> data parameters for post
data={
    '__EVENTARGUMENT':'LISTINGS;0',
    '__EVENTTARGET':'ctl00$ContentPlaceHolder$ctl00$ctl00$RadAjaxPanel_GV',
    '__EVENTVALIDATION':'/wEWGwKis6fzCQLDnJnSDwLq4+CbDwK9jryHBQLrmcucCgL56enHAwLRrPHhCgKDk6P+CwL1/aWtDQLm0q+gCALRvI2QDAKch7HjBAKWqJHWBAKil5XsDQK58IbPAwLO3dKwCwL6uJOtBgLYnd3qBgKyp7zmBAKQyTBQK9qYAXAoieq54JAuG/rDkC1djKyQMC1qnUtgoC0OjaygUCv4b7sAhfkEODRvsa3noPfz2kMsxhAwlX3Q=='
}
#we add some <dynamic> data parameters
for input_d in input_div:
    try:
        data[ input_d['name'] ] =input_d['value'] 
    except:
        pass #skip unused input field

#post request
r2=s.post(base_url,data=data)

#write the result
with open("post_result.html","w") as f:
    f.write(r2.text.encode('utf8'))

现在,请看一下“post”_结果.html“内容,你就会找到数据!在

问候

您可以使用请求bs4,获取数据,几乎如果不是所有的asp站点,都需要提供一些post参数,例如EVENTTARGETEVENTVALIDATION等。。公司名称:

from bs4 import BeautifulSoup
import requests

data = {"__EVENTTARGET": "ctl00$ContentPlaceHolder$ctl00$ctl00$RadAjaxPanel_GV",
    "__EVENTARGUMENT": "LISTINGS;0",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$ctl00$hdnProductID": "139",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$hdnProductID": "139",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$drpSortField": "Listing Number",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$drpSortDirection": "A-Z, Low-High",
    "__ASYNCPOST": "true"}

对于实际的post,我们需要在outpost数据中添加一些值:

^{pr2}$

运行代码时,您将看到打印的表。在

相关问题 更多 >