【问题标题】:How to fix the awkwardly written for loop?如何修复笨拙的 for 循环?
【发布时间】:2017-08-08 17:31:26
【问题描述】:

我在 python 中结合 selenium 编写了一个脚本,以根据“街道号码”和“地址”执行反向搜索从网站中查找名称。它适用于单次搜索。首先,脚本应从“search_post”列表中选择“A1”并将其放入浏览器的“街道搜索框”,然后应从“search_address”中选择“B1” ”列表将其放入浏览器的“地址搜索框”中。我的脚本适用于第一次搜索,但是当第一个循环用于第二个项目时,它再次使用 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()

【问题讨论】:

  • 将你的文本分成几段可以让你的问题更容易理解。
  • 请原谅我的语言困难。

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


【解决方案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...

【讨论】:

  • 感谢 Tarun Lalwani 的回答。它修复了 for 循环问题。最后一件事 - 在收集第一个信息而不是打开一个新的信息后,我怎样才能重用已经打开的浏览器?
  • 如果这是您的完整代码,我看不出打开新浏览器的任何原因。它是打开一个新标签吗?因为您的驱动程序启动和相当是外部循环。
  • 我有另一个问题已解决。
  • 这似乎是一个更复杂的答案,而不仅仅是循环一些计数器 i,超过您拥有的输入数量,然后在循环内引用 search_post[i]search_address[i]。这可以很容易地扩展以处理 n 个数据元素,而代码更改最少。
  • @Shahin 是的,这就是我所指的。不是这个答案错了​​,只是我觉得有一个更简单的解决方案。
猜你喜欢
  • 2017-12-11
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2011-10-17
相关资源
最近更新 更多