python - 如何改进用于解析链接的 python 脚本?
问题描述
我编写了一个测试,它解析来自网页的链接,并在循环中单击每个链接,然后返回主页。但是每次迭代都伴随着一次又一次地解析整个网页并覆盖链接数组,尽管每次迭代只需要一个链接。我知道这是低效的。我该如何优化呢?
我尝试只解析一次链接,然后循环遍历它们。在第一次迭代之后,它返回(到主页)并尝试单击第二个链接,但它不是交互式的(我认为这是因为存储在 links 数组中的 web 元素每次你去页)。
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get('https://yandex.ru')
def test_01(self):
driver = self.driver
links = []
time.sleep(3)
links = driver.find_elements_by_css_selector("a")
for i in range(len(links)):
links = driver.find_elements_by_css_selector("a")
links[i].click()
driver.get('https://yandex.ru')
time.sleep(3)
我期待更有效的解决方案。
解决方案
- 当您离开页面时,WebElements会随着DOM的变化而失效,因此我建议您使用List Comprehension并将 WebElements 列表转换为链接文本列表。
- 完成后,您应该能够使用normalize-text()函数,以防文本属于子元素或具有开始/尾随空格
- 最后但并非最不重要的一点是考虑使用显式等待,以防万一链接是通过AJAX调用填充的。
示例代码:
driver.get("http://yandex.ru")
links = [link.text for link in driver.find_elements_by_css_selector("a")]
for link in links:
WebDriverWait(driver, 10) \
.until(expected_conditions
.presence_of_element_located(
(By.XPATH, "//a[normalize-space()='" + link + "']"))).click()
# do what you need here
print(driver.title)
driver.back()
driver.quit()
推荐阅读
- apache-spark - apache spark 独立调度程序 - 为什么驱动程序在“集群”模式下需要一个完整的核心?
- python - 一次分布嵌套列表一个元素
- javascript - jQuery for setting value of an input type with selected radio value
- webpack - Webpack:如何只导入所需的字体真棒图标?
- wordpress - Woocommerce 单产品页面挂钩
- machine-learning - fizyr 使用视网膜网络进行汽车损坏检测的过度拟合(回归和分类)
- mysql - 如何设置在TestContainers启动的Docker实例上运行的mysql全局变量
- c++ - 如何修复代码中的“无输入文件”::blocks code c++
- c++ - 是否观察到此获取围栏?
- pointers - Printf 无法使用返回的字符串指针正确打印