Scraper:尝试在while循环中跳过代码(Python)

时间:2015-05-26 04:28:20

标签: python

我正在研究我的第一个刮刀并遇到了一个问题。我的刮刀访问网站并保存每个结果页面的链接。现在,我只希望它翻阅10页。当搜索结果少于10页时问题就出现了。我尝试使用while循环和try语句,但它似乎不起作用。刮刀经过第一页结果后,它不会在连续页面上返回任何链接;但是,它不会给我一个错误,一旦达到10页或异常就会停止。

以下是我的代码片段:

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

我真的很感激如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

您明确地抓住了ElementNotVisibleException例外并停止了它。这样您就不会看到任何错误消息。错误可能在这一行:

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

我认为这里的lambda应该是一个测试,直到成功为止。所以它不应该像点击那样做任何动作。我实际上相信你根本不需要在这里等待,页面应该已经完全加载,所以你只需点击链接:

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