2017-01-08 18 views
1

私はこのサイトの内容を削っています: http://media.ethics.ga.gov/search/Lobbyist/Lobbyist_results.aspx?&Year=2016&LastName=A&FirstName=&City=&FilerID= ここで、姓はロビーリスト情報を取得するためにA-Zです。これはジョージア州オープンサイトの州です。セレクションを使用してaspnetリンクをクリックしてください

私はループのための基本的な内の各文字によって配列決定し、必要な基本的な情報を取得する(実際にどちらか/または)MechanizeのとSeleniumの組み合わせを使用しています。 (下のコード) Seleniumとmechanizeの両方で問題が発生しているところでは、各ロビイストに関連付けられている[View Lobbyist]リンクをクリックしようとしています。

Seleniumを使用すると、最初のリンクをクリックした後、「selenium.common.exceptions.NoSuchElementException」で失敗します。メッセージ:要素がありません:要素「{"method": "id"、 "selector" : "ctl00_ContentPlaceHolder1_Results_ctl03_lnkView"} "メッセージ。各「ビューロビイスト」リンクはhrefのではなく、形であるため、

、機械化の任意br.submitを使用して()が失敗しました。

ここセレンコードの簡単なバージョンです:ここにコードを機械使用

def __init__(self): 
    self.url = "http://media.ethics.ga.gov/search/Lobbyist/Lobbyist_ByName.aspx" 
    self.br = mechanize.Browser() 
    self.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')] 

def scrape_lobbyists(self, letter): 
    urlstr = "http://media.ethics.ga.gov/search/Lobbyist/Lobbyist_results.aspx?Year=2016&LastName="+letter+"&FirstName=&City=&FilerID=" 
    driver.get(urlstr) 

    soup = BS(driver.page_source) 

    table = soup.find("table", { "id" : "ctl00_ContentPlaceHolder1_Results" }) # Need to add error check here... 
    if table is None: # No lobbyist with last name starting with 'X' :-) 
     return 
    records = table.find_all('tr')  # List of all results for this letter 

    for row in records: 
     rec_print = "" 
     span = row.find_all('span', 'lblentry', 'value') 
     for sname in span: 
      stext = sname.get_text() 
      if ',' in stext:  
       continue 
      rec_print = rec_print + stext + "," # Create comma-delimited output 
     print(rec_print[:-1]) # Strip final comma 
     lnks = row.find_all('a', 'lblentrylink') 
     for lnk in lnks: 
      if lnk is None: # For some reason, first record is blank. 
       continue 
      newlnk = lnk['id'] # OK, this is the new URL 
      newstr = lnk['href'] 
      newctl = newstr[+25:-5] # Matching placeholder (strip javascript....) 
      print("Lnk: ", lnk) 
      print("NewLnk: ", newlnk) # Just look at various elements 
      print("LnkStr: ", newstr) 
      print("LnkCtl: ", newctl) 
      driver.find_element_by_id(newlnk).click() # newlnk seems to be the right one... 

br.open(」http://media.ethics.ga.gov/search/Lobbyist/Lobbyist_results.aspx?&Year=2016&LastName= "+文字+" &姓= &市= & FilerID =が、 ") スープ= BS(br.response()。read())

table = soup.find("table", { "id" : "ctl00_ContentPlaceHolder1_Results" }) # Need to add error check here... 
if table is None: # No lobbyist with last name starting with 'X' :-) 
    continue 
records = table.find_all('tr')  # List of all results for this letter 

for form in br.forms(): 
    print "Form name:", form.name 
    print form 

for row in records: 
    rec_print = "" 
    span = row.find_all('span', 'lblentry', 'value') 
    for sname in span: 
     if ',' in sname.get_text(): # They actually have a field named 'comma'!! 
      continue 
     rec_print = rec_print + sname.get_text() + "," # Create comma-delimited output 
    print(rec_print[:-1]) # Strip final comma 

    lnk = row.find('a', 'lblentrylink') 
    if lnk is None: # For some reason, first record is blank. 
     continue 
    print("Lnk: ", lnk) 
    newlnk = lnk['id'] 
    print("NEWLNK: ", newlnk) 
    newstr = lnk['href'] 
    newctl = newstr[+25:-5] # Matching placeholder (strip javascript....) 
    br.select_form('aspnetForm') # Tried (nr=0) also... 
    print("NEWCTL: ", newctl) 
    br[__EVENTTARGET] = newctl 
    response = br.submit(name=newlnk).read() 

とにかく、困っていますので、どんな指導も頂けます!

答えて

0

問題がある - あなたは「表示ロビイスト」リンクをクリックすると、同じブラウザウィンドウに別のURLにリダイレクトされました。 2番目の「Lobbyistを見る」リンクをクリックしたい場合は、ロビイストのリストに戻る必要があります。

from pprint import pprint 

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


driver = webdriver.Firefox() 
driver.get("http://media.ethics.ga.gov/search/Lobbyist/Lobbyist_results.aspx?&Year=2016&LastName=A&FirstName=&City=&FilerID=") 

wait = WebDriverWait(driver, 15) 

results = [] 
# iterate over the results skipping the header row 
for index in range(1, len(driver.find_elements_by_css_selector("table#ctl00_ContentPlaceHolder1_Results tr"))): 
    # get the current row 
    rows = driver.find_elements_by_css_selector("table#ctl00_ContentPlaceHolder1_Results tr") 
    lobbyist = rows[index] 

    # extract some data and follow the link 
    name = lobbyist.find_element_by_css_selector("[id$=lblFName]").text 

    profile_link = lobbyist.find_element_by_css_selector("[id$=lnkView]") 
    profile_link.click() 

    # wait for the page to load 
    filer_id = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[id$=lblFilerID]"))).text 

    # go back 
    driver.back() 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#ctl00_ContentPlaceHolder1_Results tr"))) 

    results.append({"name": name, 
        "filer_id": filer_id}) 

driver.close() 

pprint(results) 

プリント:

[{'filer_id': 'L20160009', 'name': 'ASHLEY'}, 
{'filer_id': 'L20120018', 'name': 'ANNA'}, 
{'filer_id': 'L20050601', 'name': 'BILLY'}, 
{'filer_id': 'L20090142', 'name': 'CHANDON'}, 
{'filer_id': 'L20130009', 'name': 'CHARLES'}, 
{'filer_id': 'L20140179', 'name': 'MARY PAIGE'}, 
{'filer_id': 'L20050237', 'name': 'NORMER'}, 
{'filer_id': 'L20060195', 'name': 'PAMELA'}, 
{'filer_id': 'L20090281', 'name': 'SHAUN'}, 
{'filer_id': 'L20150090', 'name': 'TYLER'}, 
{'filer_id': 'L20160162', 'name': 'SARKIS'}, 
{'filer_id': 'L20150045', 'name': 'SAMUEL'}, 
{'filer_id': 'L20160098', 'name': 'JOSHUA'}, 
{'filer_id': 'L20130110', 'name': 'TIMOTHY'}, 
{'filer_id': 'L20060300', 'name': 'JENNIFER'}, 
{'filer_id': 'L20080329', 'name': 'BRAD'}, 
{'filer_id': 'L20130177', 'name': 'ELIZABETH'}, 
{'filer_id': 'L20120102', 'name': 'C.'}, 
{'filer_id': 'L20050996', 'name': 'STEVE'}, 
{'filer_id': 'L20110128', 'name': 'TRACY'}, 
{'filer_id': 'L20100284', 'name': 'JASON'}, 
{'filer_id': 'L20150052', 'name': 'MOLLY'}, 
{'filer_id': 'L20050253', 'name': 'ELIZABETH'}, 
{'filer_id': 'L20150016', 'name': 'BLAKE'}] 
+0

うわー、ロビイストの名前を収集し、「プロファイル」リンクを辿っとファイラIDを取得し、プロセスを繰り返すために戻って行く - ここ

は実装です! pprintは私のLinuxシステム上で動作しないようですが、これは私が望んでいたものとまったく同じです。私は必要なものをつかむためにいくつかのコードを追加し始めますが、ちょうどくそ! - ありがとう! –

+0

もう一度ありがとう!あなたのコードは完璧に動作しており、A-ZループとBamでラップしただけです!完璧。あなたが見たものに基づいて、これも純粋に機械化の中で行うことができますか?私は機械化がはるかに優れていることを知っています。 –

+0

@GerryGilmore nice!うまくいきました。トピックを解決するための答えを受け入れることができるかどうかを確認してください。ありがとう。 – alecxe

関連する問題