2015-05-26 3 views
0

Я работаю над своим первым скребком и столкнулся с проблемой. Мой скребок обращается к веб-сайту и сохраняет ссылки на каждой странице результатов. Теперь я хочу, чтобы он прошел через 10 страниц. Проблема возникает, когда результаты поиска имеют менее 10 страниц. Я попытался использовать цикл while вместе с инструкцией try, но, похоже, не работает. После того, как скребок проходит первую страницу результатов, он не возвращает никаких ссылок на последовательные страницы; однако он не дает мне ошибку и останавливается, когда он достигает 10 страниц или исключение.Скребок: Попробуйте пропустить код во время цикла (Python)

Вот отрывок из моего кода:

links = [] 
page = 1 
while(page <= 10): 
    try: 
     # Get information from the propertyInfo class 
     properties = WebDriverWait(driver, 10).until(lambda driver: driver.find_elements_by_xpath('//div[@class = "propertyInfo item"]')) 
     # For each listing 
     for p in properties: 
      # Find all elements with a tags 
      tmp_link = p.find_elements_by_xpath('.//a') 
      # Get the link from the second element to avoid error 
      links.append(tmp_link[1].get_attribute('href')) 
     page += 1 
     WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath('//*[@id="paginador_siguiente"]/a').click()) 
    except ElementNotVisibleException: 
     break 

Я действительно ценю любые указатели о том, как решить эту проблему.

ответ

0

Вы явно поймаете исключение и прекратите на нем исключение ElementNotVisibleException. Таким образом, вы не увидите сообщения об ошибке. Ошибка, вероятно, в этой строке:

WebDriverWait(driver, 10).until(lambda driver: 
    driver.find_element_by_xpath('//*[@id="paginador_siguiente"]/a').click()) 

Я предполагаю, что лямбда здесь должен быть тест, который выполняется до тех пор, пока удалось. Поэтому он не должен делать никаких действий, таких как щелчок. Я на самом деле считаю, что вам не нужно ждать здесь вообще, страница должна быть уже полностью загружены, так что вы можете просто нажать на ссылку:

driver.find_element_by_xpath('//*[@id="paginador_siguiente"]/a').click() 

Это будет либо перейти на следующую страницу (и WebDriverWait на старте цикла будет ждать его) или повысить исключение, если не будет найдена следующая ссылка.

Кроме того, вам лучше свести к минимуму try ... except область, таким образом вы не будете захватывать что-то непреднамеренно. Например. здесь вы хотите только округлить код поиска следующей ссылки:

# ... 
while(page <= 10): 
    # Scrape this page 
    properties = WebDriverWait(driver, 10).until(...) 
    for p in properties: 
     # ... 
    page += 1 

    # Try to pass to next page 
    try: 
     driver.find_element_by_xpath('//*[@id="paginador_siguiente"]/a').click() 
    except ElementNotVisibleException: 
     # Break if no next link is found 
     break 
+0

Это частично помогло. Я думаю, что у меня большая проблема с самим сайтом, который разрушает мой код. Скоро я обновлю. Благодарю. –

Смежные вопросы