python - 使用 Selenium 在 Kickstarter 中单击链接
问题描述
我试图仅根据项目名称来抓取 Kickstarter。使用项目名称和基本 URL,我可以访问搜索页面。为了抓取项目页面,我需要使用 Selenium 点击 URL。但是,我无法将 Selenium 指向要单击的正确元素。我也希望这是动态的,所以我不需要每次都输入项目名称。
<div class="type-18 clamp-5 navy-500 mb3">
<a href="https://www.kickstarter.com/projects/1980119549/knife-block-
designed-by-if-and-red-dot-winner-jle?
ref=discovery&term=Knife%20block%20-
%20Designed%20by%20IF%20and%20Red%20dot%20winner%20JLE%20Design"
class="soft-black hover-text-underline">Knife block -
Designed by IF and
Red dot winner JLE Design
</a>
</div>`
driver = webdriver.Chrome(chrome_path)
url = 'https://www.kickstarter.com/discover/advanced?ref=nav_search&term=Knife
block - Designed by IF and Red dot winner JLE Design'
driver.get(url)
elem = driver.find_elements_by_link_text('Knife block - Designed by IF and Red
dot winner JLE Design')
elem.click()
如何让 elem 指向正确的链接?
解决方案
关于您的尝试,您的代码有一个错字: usingfind_elements....
返回一个元素列表,因此该方法.click()
不起作用。你的意思是使用find_element
.
要动态单击链接,请改用 XPath。结果代码将是:
elem = driver.find_element_by_xpath('//div[contains(@class, "type-18")]/a')
elem.click()
这将抓住第一场比赛。您可以执行find_elements
并迭代元素,但这将是一种不好的方法,因为由于您单击链接,每次都会使前一页过时。如果有多个,您可以使用相同的 XPath 但已编入索引:
first_elem = driver.find_element_by_xpath('(//div[contains(@class, "type-18")]/a)[1]')
first_elem.click()
# ...
second_elem = driver.find_element_by_xpath('(//div[contains(@class, "type-18")]/a)[2]')
second_elem.click()
# And so forth...
推荐阅读
- r - R如何创建一个新变量,该变量引用另一个数据框中的特定值
- algorithm - AC-3算法的时间复杂度
- sql-server - 无法将大型数据库附加到在 docker 容器进程中运行的 SQL Server 引擎
- python - 将 wordpress xml 文件导入 Python 项目
- svelte - 尝试在 svelte 组件运行之前加载 js 文件
- docker - 如何为 2 个不同的项目配置 nginx(2 个不同的 docker compose 文件)
- date - 月份编号到月份名称
- youtube-iframe-api - 如何格式化多参数 YouTube URL?
- c# - 使用内部编译器和使用 Microsoft.CodeAnalysis.CSharp.Scripting 编译时如何引用外部项目 DLL;
- python - 反脏话系统将非脏话列入黑名单