我正在研究我的第一个刮刀并遇到了一个问题。我的刮刀访问网站并保存每个结果页面的链接。现在,我只希望它翻阅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
我真的很感激如何解决这个问题。
答案 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