2016-08-18 9 views
0

테이블에서 __doPostBack 함수를 사용하는 경우 기계화를 사용하여 웹 페이지의 테이블을 탐색하려면 어떻게해야합니까?__doPostBack 함수를 사용하여 파이썬 기계어 탐색

내 코드는 다음과 같습니다

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

기계화는 __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()