2016-04-07 16 views
1

Ich versuche, auf Daten auf dieser Website zuzugreifen: http://surge.srcc.lsu.edu/s1.html. Bisher habe ich meine Code-Schleife durch die Dropdown-Menüs, und ich möchte die Seiten an der Spitze der Tabelle [1] [2] .. ect. Ich habe versucht, Select zu verwenden, aber ich erhalte den Fehler, dass Select nicht mit span verwendet werden kann: "UnexpectedTagNameException: Select funktioniert nur für Elemente, nicht für < span>".Durchblättern von Seiten zu webscrap

# importing libraries 
from selenium import webdriver 
import time 
from selenium.webdriver.support.ui import Select 
from bs4 import BeautifulSoup 
import re 

driver = webdriver.Firefox() 
driver.get("http://surge.srcc.lsu.edu/s1.html") 

# definition for switching frames 
def frame_switch(css_selector): 
    driver.switch_to.frame(driver.find_element_by_css_selector(css_selector)) 

# data is in an iframe 
frame_switch("iframe") 

html_source = driver.page_source 
nameSelect = Select(driver.find_element_by_xpath('//select[@id="storm_name"]')) 
stormCount = len(nameSelect.options) 
data=[] 
for i in range(1, stormCount): 
    print("starting loop on option storm " + nameSelect.options[i].text) 
    nameSelect.select_by_index(i) 
    time.sleep(3) 


    yearSelect = Select(driver.find_element_by_xpath('//select[@id="year"]')) 
    yearCount = len(yearSelect.options) 
    for j in range(1, yearCount): 
     print("starting loop on option year " + yearSelect.options[j].text) 
     yearSelect.select_by_index(j) 


     time.sleep(2) 

Dies ist, wo ich Probleme habe die Seite Auswahl:

statt
 change_page=Select(driver.find_element_by_class_name("yui-pg-pages")) 
     page_count = len(change_page.options) 
     for k in range(1, page_count): 
      change_page.select_by_index(k) 



     # Select Page & run following code 
      soup = BeautifulSoup(driver.page_source, 'html.parser') 
      print(soup.find_all("tbody", {"class" : re.compile(".*")})[1]) 
      # get the needed table body 
      table=soup.find_all("tbody", {"class" : re.compile(".*")})[1] 
      rows = table.find_all('tr') 
      for row in rows: 
       cols = row.find_all('td') 
       cols = [ele.text.strip() for ele in cols] 
       data.append(cols) 
+0

meine Antwort geholfen hat? – DuckPuncher

+0

Ja, vielen Dank! – Corncobpipe

+0

Sie sollten die Antwort akzeptieren, indem Sie auf das Häkchen bei der Antwort klicken, es würde mir wirklich helfen: D – DuckPuncher

Antwort

1

Verwenden Sie einen XPath-Selektor.

driver.find_element_by_xpath('//a[@class="yui-pg-next"]') 

Dann nur Schleife, während Sie mit der nächsten Schaltfläche interagieren können. Ich bevorzuge diese Methode, wenn sich die Anzahl der Seiten ändern kann, während ich die Seiten durchblättere. Sie sollten Select nicht verwenden müssen. In der Tat glaube ich nicht, dass Select für alles andere als Dropdown-Menüs gedacht ist.

Oder wenn Sie es mit Hilfe der Links-Seite, weil die Seiten oft nicht ändern tun müssen, könnten Sie so etwas wie versuchen:

# Use find_elements_by_xpath to select multiple elements. 
pages = driver.find_elements_by_xpath('//a[@class="yui-pg-page"]') 

# loop through results 
for page_link in pages: 
    page_link.click() 
    # do stuff. 
Verwandte Themen