python - Selenium - 获取相关 Web 元素标签不断变化的信息
问题描述
给定一个搜索词,我试图获取亚马逊上图书类别下的结果类别下的结果,并获取给定搜索词的每本书的详细信息。
我遇到了一个问题,有时我的代码能够找到结果,有时它会失败。在进一步检查后,我意识到这些项目有时会用<li>
标签列出,有时会用<div>
标签。
下面粘贴的是同一元素的元素和代码片段,以支持我的声明。
<li>
带有标签的 HTML :
<li id="result_0" data-asin="0128023074" class="s-result-item celwidget ">
<div>
带有标签的 HTML :
<div data-asin="0128023074" data-index="0" class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28" data-cel-widget="search_result_0"><div class="sg-col-inner">
我还是 Selenium 的新手,所以为了解决这个问题,我使用了下面的代码片段,我很确定有更好的方法来处理这个问题。
try:
book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "result_0")))
book_detail(book, details)
except TimeoutException:
book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-index=\"0\" and @data-cel-widget=\"search_result_0\"]")))
book_detail_by_div(book, details)
有人可以帮我理解为什么标签相关的变化会这样,以及如何处理这样的情况吗?
解决方案
关于为什么会发生这种情况的第一个问题,我不确定。我尝试了不同的操作系统/浏览器和窗口大小,但无法重现div
元素的大小写。
为了改进您的代码,我有一个建议,但它可能不是您的最佳解决方案,因此您可以尝试。这将等待两种类型的元素中的任何一种一起可见,而不是等待第一种类型和第二种类型的 10 秒。
try:
book = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[(@id="result_0") or (@data-index="0" and @data-cel-widget="search_result_0")]')))
except TimeoutException:
print("Did not find search result")
else:
# So atleast one of the tag type is visible.
# Even if the attribute is not present then it will return None.
if book.get_attribute('id') == "result_0":
book_detail(book, details)
else:
book_detail_by_div(book, details)
推荐阅读
- php - 无法在 magento 2 中保存新客户详细信息
- php - mysql不接受表名
- linq - 执行 Select 时在 EF Core 3 中将 Day 添加到 DateTime
- grpc - 带有 gRPC 的断路器
- tensorflow - 通过 API 对 Keras 模型进行在线预测
- react-native - 我正在尝试从 React Native 中的 post 表中获取 post 数据
- azure - 我可以在单个命令中从 databricks 笔记本返回超过 1 个值吗?
- java - @Import - Annotation 参数必须是编译时间常数
- r - R将lm模型的拟合值和残差合并到原始数据集
- javascript - 将 Nuxt 应用程序部署到域上的子目录