2016-09-16 4 views
0

ウェブサイトは、get要求(クライアント側で非同期に処理される)を必要とせずに、2つの日付フィルタ(年/週)を使用してコンテンツを動的に変更します。各フィルタオプションは、抽出したいtd要素を持つ別のpage_sourceを生成します。ネストされたforループの問題で固執

現在、フィルタを繰り返し処理するためにfor-loopのネストされたリストを使用しています(異なるtd要素を含む異なるページソース、各ページソースの内容を繰り返した後、空のリストに目的のtd要素を追加します。

store = [] 

def getData(): 
    year = ['2015','2014'] 


    for y in year: 
     values = y 
     yearid = Select(browser.find_element_by_id('yearid')) 
     fsid.select_by_value(values) 


     weeks = ['1', '2'] 
     for w in weeks: 
      value = w   
      frange = Select(browser.find_element_by_id('frange')) 
      frange.select_by_value('WEEKS') 
      selectElement = Select(browser.find_element_by_id('fweek')) 
      selectElement.select_by_value(value) 
      pressFilter = browser.find_element_by_name('submit') 
      pressFilter.submit() 

      #scrape data from page source 

      html = browser.page_source 

      soup = BeautifulSoup(html, "lxml") 


      for el in soup.find_all('td'): 
       store.append(el.get_text()) 

これまでのところは良い、と私は私が望むすべてのtd要素の単一のリストを作成forループを持っている。

代わりに、私は、別々のリストを格納するための1つを希望各ページのソース(つまり、フィルタの組み合わせごとに1つ)をリストのリストに入れておくことができます。次に、いくつかの基準に従ってリストから項目を抽出します。

ただし、元の追加の時点でこれを行うことはできますか?何かが好きです...

store = [[],[], [], []] 

... 

    counter = 0 
    for el in soup.find_all('td'): 
     store[counter].append(el.get_text()) 
    counter = counter +1 

これは、ストアリストの最初のオブジェクトにのみ追加されるため、正しくありません。 td for-loopにカウンタを置くと、td要素が反復されるたびに増加します。実際には、特定のページソースを反復処理し終えたときにのみ増加します(それ自体が反復です)。フィルタの組み合わせの)。

私は困惑していますが、私も可能なことを試みていますか?もしそうなら、どこにカウンターを置くべきですか?それとも、私は他の技術を使うべきですか?

+1

私はあなたの質問に任意のリストの内包表記は表示されません。あなたの現在のコード(通常のループを使用している)では、フィルタの組み合わせごとに新しいリストオブジェクトを作成して追加し、すべての 'td'テキスト結果をその新しいリストに追加します:' perfilter = [] '、' store.append(perfilter) '、' find_all() 'ループで' perfilter.append(el.get_text()) 'を実行します。 –

+0

私はリストの理解への参照を訂正しました – abc

答えて

1

フィルタの組み合わせごとに新しいリストオブジェクトを作成します。つまり、for w in weeks:ループ内に作成します。 そのリストにあなたのセルのテキストを追加し、storeに、これは生産ごとのフィルタリストを追加します。

def getData(): 
    store = [] 
    year = ['2015','2014'] 

    for y in year: 
     # ... elided for brevity  

     weeks = ['1', '2'] 
     for w in weeks: 
      perfilter = [] 
      store.append(perfilter) 

      # ... elided for brevity  

      for el in soup.find_all('td'): 
       perfilter.append(el.get_text()) 
関連する問題