如何修复笨拙的for循环?

时间:2017-08-08 17:31:27

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经在python中结合selenium编写了一个脚本,根据"街道号码"从网站上找到一个名字。和"地址"执行反向搜索。它适用于单个搜索。首先,脚本应该选择" A1"来自" search_post"列表将其放入"街道搜索框"在浏览器中,它应该选择" B1"来自" search_address"列表将其放入"地址搜索框"在浏览器中。我的脚本适用于第一次搜索,但是当第一个循环用于第二个项目时,它再次使用A1而不是A2,第二个循环选择正确的项目,在这种情况下是B2。更具体地说,第一次需要A1,B1,但第二次需要A1,B2代替A2,B2。如何修复此循环以便它并行选择项目。

A1. 8227  B1. FINDLAY ST
A2. 6330  B2. LAUTREC DR

这是脚本:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

search_post = ['8227','6330 ']
search_address = ['FINDLAY ST','LAUTREC DR']

driver = webdriver.Chrome()
driver.get("http://hcad.org/quick-search/")
wait = WebDriverWait(driver, 10)

for item in search_post:
    for elem in search_address:
        driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))
        driver.find_element_by_id("s_addr").click()
        wait.until(EC.presence_of_element_located((By.NAME, 'stnum')))
        driver.find_element_by_name('stnum').send_keys(item)
        driver.find_element_by_name('stname').send_keys(elem)
        driver.find_element_by_xpath("//input[@value='Search']").click()
        driver.switch_to.frame(driver.find_element_by_id("quickframe"))
        element = driver.find_element_by_xpath("//td[@class='data']/table//th")
        print(driver.execute_script("return arguments[0].childNodes[2].textContent", element).strip())

driver.quit()

1 个答案:

答案 0 :(得分:1)

您需要的是python zip方法。从

更改循环开始
for item in search_post:
    for elem in search_address:

for item, elem in zip(search_post, search_address)

zip基本上做的是创建一对元组的元组,然后放入一个数组中。以下是执行示例

>>> zip([1,2],[3,4])
[(1, 3), (2, 4)]

编辑8月9日:

作为@JeffC,建议更简单的方法是仅使用索引。有多种方法可以做到这一点,但为了简单起见,我也将列出索引。改为

for item in search_post:
    for elem in search_address:

i = 0
while i < len(search_post):
  item, elem = search_post[i], search_address[i]
  i += 1
  ....rest of your code...