[英]Selenium Python xpath contains and sibling question
我正在尝试在网页上使用 python selenium 到 select 用户并打开指向他们个人资料的链接。 以下是网页上每个用户的重复 HTML:
<div class="w-50-ns w-100 ph1">
<div class="w-100 br1 pointer bg-animate hover-bg-dark-primary bg-near-black" onclick="openLink(event, '/users/0000')">
<div class="pv2 pr3 pl2 mb2 br1">
<div class="flex items-center pa1">
<div class="flex-auto mw-100">
<div class="flex items-center">
<div class="flex-none flex items-center">
<a class="relative overflow-hidden dib mr3-ns mr2 link" data-tippy-theme="lighter small" href="/users/0000" aria-expanded="false">
<img class="db ipp br1 object-cover" src="https://" width="70" height="70">
</a>
</div>
<div class="relative flex-auto mw-100 mw-none-ns" style="max-height: 58px; top: -1px;">
<div class="lh-copy truncate silver">
<a class="link span f5 fw7 secondary" href="/users/0000">UserName</a>
<span class="f6 fw7 silver">AgeSex Category</span>
</div>
<div class="f6 lh-copy fw4 silver nowrap truncate">Los Angeles, California</div>
<div class="relative pd1 f6 fw4 lh-copy mid-gray nowrap truncate">
<a class="link gray hover-silver" href="/users/0000/pictures"># pics</a>
·
<a class="link gray hover-silver" href="/users/0000/posts"># posts</a>
</div>
</div>
</div>
</div>
<div class="flex">
<div class="tr">
</div>
</div>
</div>
</div>
</div>
</div>
这是我正在研究的主要部分。 我正在尝试检查 AgeSex(即 19F 或 20M)是否与选定的范围和性别匹配,如果匹配,请单击其上方的用户个人资料链接
<div class="lh-copy truncate silver">
<a class="link span f5 fw7 secondary" href="/users/0000">UserName</a>
<span class="f6 fw7 silver">AgeSex Category</span>
</div>
我试过了:
self.driver.find_elements_by_xpath("//span[contains(., '18F') or contains(., '20M')])/preceding-sibling::class[ @name = 'link span f5 fw7 secondary']").click()
self.driver.find_elements_by_xpath("//span[contains(text(), '18F') or contains(text(), '20M')])/preceding-sibling::class[ @name = 'link span f5 fw7 secondary']").click()
但我得到了错误:
actions.move_to_element(element, 0, 0).perform()
TypeError: move_to_element() takes 2 positional arguments but 4 were given
我是新手,所以我不知道我是否朝着正确的方向前进,任何帮助将不胜感激。 谢谢你。
我可以使用以下命令执行单击:
driver.find_element_by_xpath("//span[contains(., '18F') or contains(., '20M')]/preceding-sibling::a[@class = 'link span f5 fw7 secondary']").click()
这里有一些注意事项:
对于前面的兄弟,语法是前面的兄弟::{xPath} --> 前面的兄弟::tagname[@attibute='value']
我建议您使用find_element_by xpath
(单数)而不是find_elements_by_xpath
(复数),因为最新返回的列表没有click()
function。 如果要单击多个元素,请使用find_elements_by_xpath
列出它们,然后遍历它们以单击每个元素的前一个兄弟。
例如:
elems = driver.find_elements_by_xpath("//span[contains(., '18F') or contains(., '20M')]")
for elem in elems:
elem.find_element_by_xpath("./preceding-sibling::a[@class = 'link span f5 fw7 secondary']").click()
所以我今天玩了一下,发现了如何打开单个AgeSex的url:
self.driver.find_element_by_xpath("//span[contains (.,'23F')]").click();
我决定 go 另一条路线,而不是点击一个元素,列出所有网址。
self.driver.find_element(By.XPATH,"//span[contains (.,'30F')]/preceding-sibling::a[1]").get_attribute('href')
以上只是一个单一的 AgeSex,所以我必须为每个选项写出来。 如果一个不存在,它会抛出一个错误,所以我为每个都写了一个 try 和 except 块:
try:
if self.driver.find_element(By.XPATH, "//span[contains (.,'27F')]").is_displayed():
user27 = self.driver.find_element(By.XPATH,"//span[contains (.,'27F')]/preceding-sibling::a[1]").get_attribute('href')
if user27 not in urls:
urls.append(user27)
except:
pass
如果属性存在,它会将 href 添加到列表中。
我觉得必须有更好的方法来写这个。 一种更高效且不需要 10-15 次尝试和除块的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.