2016-08-18 5 views
0

テーブルが__doPostBack関数を使用する場合、機械化を使用してWebページ上のテーブルをナビゲートするにはどうすればよいですか?__doPostBack関数を使用したPythonの機械化ナビゲーション

私のコードは次のとおりです。

import mechanize 
br = mechanize.Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open("http://www.gfsc.gg/The-Commission/Pages/Regulated-Entities.aspx?auto_click=1") 

page_num = 2 
for link in br.links(): 
    if link.text == str(page_num): 
     br.open(link) #I suspect this is not correct 
     break 

for link in br.links(): 
    print link.text, link.url 

テーブル内のすべてのコントロールの検索(例えばドロップダウンメニュー)ページのボタンを示すが、テーブル内のすべてのリンクの検索がいません。ページボタンにはURLが含まれていないため、一般的なリンクではありません。私はTypeError:期待される文字列またはバッファを取得します。

私はこれが機械化を使用して行うことができるという印象を受けます。

読んでいただきありがとうございます。

答えて

1

Mechanizeを使用して、__doPostBackを使用するテーブルをナビゲートできます。私はBeautifulSoupを使用して、必要なパラメータのHTMLを解析し、便利なguidance with the regexを追跡しました。私のコードは以下に書かれています。

import mechanize 
import re # write a regex to get the parameters expected by __doPostBack 
from bs4 import BeautifulSoup 
from time import sleep 

br = mechanize.Browser() 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
response = br.open("http://www.gfsc.gg/The-Commission/Pages/Regulated-Entities.aspx?auto_click=1") 
# satisfy the __doPostBack function to navigate to different pages 
for pg in range(2,5): 
    br.select_form(nr=0) # the only form on the page 
    br.set_all_readonly(False) # to set the __doPostBack parameters 

    # BeautifulSoup for parsing 
    soup = BeautifulSoup(response, 'lxml') 
    table = soup.find('table', {'class': 'RegulatedEntities'}) 
    records = table.find_all('tr', {'style': ["background-color:#E4E3E3;border-style:None;", "border-style:None;"]}) 

    for rec in records[:1]: 
     print 'Company name:', rec.a.string 

    # disable 'Search' and 'Clear filters' 
    for control in br.form.controls[:]: 
     if control.type in ['submit', 'image', 'checkbox']: 
      control.disabled = True 

    # get parameters for the __doPostBack function 
    for link in soup("a"): 
     if link.string == str(page): 
      next = re.search("""<a href="javascript:__doPostBack\('(.*?)','(.*?)'\)">""", str(link)) 
      br["__EVENTTARGET"] = next.group(1) 
      br["__EVENTARGUMENT"] = next.group(2) 
    sleep(1)  
    response = br.submit() 
関連する問題