2016-08-04 74 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