2016-08-04 71 views
2

我有一个page,它有一个我需要删除的表(表id =“ctl00_ContentPlaceHolder_ctl00_ctl00_GV”class =“GridListings”)。 我通常使用BeautifulSoup & urllib,但在这种情况下,问题是表需要一些时间来加载,所以当我尝试使用BS获取时,它并未被捕获。 我不能使用PyQt4的,drysracpe或风车因为一些安装问题,所以唯一可能的方式是使用硒/ PhantomJS 我尝试以下,仍然没有成功:需要废弃通过ajax使用python加载的表格(selenium)

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')) 

上面的代码犯规给我表中所需的内容。 我该如何去实现这个?

+0

你是什么意思不给我想要的内容?有什么异常吗?你能不能在这里分享你的表格HTML? –

+0

嗨,[链接](https://seahawks.strmarketplace.com/Charter-Seat-Licenses/Charter-Seat-Licenses.aspx)底部表是我想要的(表类=“GridListings”) – user3425403

+0

我'对不起,但我不能查看表格这一次,这就是为什么我告诉你在这里分享表格HTML .. –

回答

2

可以使用请求BS4,获取数据,几乎如果不是全部的asp网站有几个post数据总是需要像__EVENTTARGET__EVENTVALIDATION提供等。:

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 = "https://seahawks.strmarketplace.com/Charter-Seat-Licenses/Charter-Seat-Licenses.aspx" 
with requests.Session() as s: 
    s.headers.update({"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}) 
    soup = BeautifulSoup(s.get(post).content) 

    data["__VIEWSTATEGENERATOR"] = soup.select_one("#__VIEWSTATEGENERATOR")["value"] 
    data["__EVENTVALIDATION"] = soup.select_one("#__EVENTVALIDATION")["value"] 
    data["__VIEWSTATE"] = soup.select_one("#__VIEWSTATE")["value"] 

    r = s.post(post, data=data) 
    soup2 = BeautifulSoup(r.content) 
    table = soup2.select_one("div.GridListings") 
    print(table) 

你会看到,当你运行该代码打印的表格。

+0

你是绝对正确的!!!!!我现在可以看到桌子了。感谢很多!!!我有一个疑问,因为我们静态地发布了几页参数,页面没有被下载的机会吗?我的意思是桌子将是每次我们运行这个权利时更新一个? – user3425403

+0

@ user3425403,是的,我们只是在进行必要的验证,还有很多参数可以传递,我没有查看所有参数,但是您应该能够通过添加更多参数来影响数据返回的方式。 –

+0

谢谢,理解 – user3425403

0

如果您想要删除某些内容,首先安装一个Web调试器(例如Firebug,例如Mozilla Firefox)以观察您想要废弃的网站的工作方式。

接下来,你需要复制该网站是如何连接到后台

至于你说的过程中,要报废的内容是被异步加载(仅当文档准备好)

假设调试程序正在运行,你也已经刷新页面,你会看到网络选项卡上的以下要求:

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

最后的流程,达到ÿ我们的目标将是:

  • 1 /使用requests python module
  • 2 /打开请求会话索引页网站的网站(使用cookie处理)
  • 3 /废料全部输入特定的POST表单请求
  • 4 /构建一个POST参数DICT,其中包含上一步中报废的所有输入值& +添加一些特定的固定参数。
  • 5/POST请求(与所需的数据)
  • 6 /使用最后BS4 module(像往常一样),以汤回答HTML放弃你的数据

请参见下文一个工作代码:

#!/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_result.html”内容,您会发现数据!

问候

+0

你有没有检查页面的参数??我不认为这将工作。你会明白如果你已经看过帖子请求 – user3425403

+0

年,这就是为什么我在这个过程中添加了第3步和第4步,我会在接下来的5分钟内用一个工作代码更新我的答案。 –

+1

感谢您的努力,但仍然没有捕获表:看看输出文件,表会出现在下面的innerdiv里面,它仍然是空的

user3425403