2016-09-16 5 views
0

웹 사이트는 get 요청 (클라이언트 측에서 비동기 적으로 처리됨)없이 두 개의 날짜 필터 (연도/주)를 사용하여 동적으로 내용을 변경합니다. 각 필터 옵션은 추출하려는 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 요소의 단일 목록을 구성 루프를 가지고있다. 대신

, 나는 들어, 하나를 별도의 목록을 저장하고 싶습니다 각 페이지 소스 (즉, 필터 조합 당 하나) 목록의 목록. 나는 사실을 할 수있는 두 번째 단계에서 즉 내가 cou 그런 다음 일부 기준에 따라 목록에서 항목을 추출합니다.

그러나 원래 추가 시점에서 할 수 있습니까? 뭔가 ...

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())