Javascript 如何查找包含单词“quot”的所有元素;下载「;使用Selenium x-path?

Javascript 如何查找包含单词“quot”的所有元素;下载「;使用Selenium x-path?,javascript,python,html,selenium,xpath,Javascript,Python,Html,Selenium,Xpath,我正在使用Selenium做一些webscraping,现在我想在链接文本、按钮文本、元素id、元素class或href中找到用户可以点击的所有元素,以及包含“下载”(任何大小写)字样的元素。这可以包括链接、按钮或任何其他元素 在中,我找到了一个xpath,用于查找xpath以基于特定文本(或不区分大小写和部分匹配)搜索按钮的人: 但是,即使存在以下链接,也不会返回任何结果: <a id="downloadTop" class="navlink" href="javascript:__do

我正在使用Selenium做一些webscraping,现在我想在链接文本、按钮文本、元素
id
、元素
class
href
中找到用户可以点击的所有元素,以及包含“下载”(任何大小写)字样的元素。这可以包括链接、按钮或任何其他元素

在中,我找到了一个xpath,用于查找xpath以基于特定文本(或不区分大小写和部分匹配)搜索按钮的人:

但是,即使存在以下链接,也不会返回任何结果:

<a id="downloadTop" class="navlink" href="javascript:__doPostBack('downloadTop','')">Download</a>

有人知道我如何获得用户可以点击的所有元素,以及在链接文本、按钮文本、元素
id
、元素
class
href
中包含“下载”一词的所有元素吗?欢迎所有提示

在使用Selenium查找web元素时,最好总是先搜索“ID”或“类名”,因为它比使用XPath更可靠、更容易,通常只有在使用前面提到的前两种方法找不到元素时才使用XPath

在这种情况下,您在该网站的下载元素中有一个非常清晰的ID标签

请尝试使用此选项:

downloadButton = driver.find_element_by_id('downloadTop')
然后您可以使用此按钮单击它:

downloadButton.click()

嗯,我对硒不是很了解,但我可以提出一个解决方案,它会起作用的。您可以先使用正则表达式解析整个页面源代码。例如,如果您只需要包含“下载”子字符串的属性元素,请使用以下正则表达式:

<\w*([a-zA-Z]+).*\w+([a-zA-Z]+)="(.*?download.*?)"?\/?>

嗯,你找到的答案已经告诉你如何做你想做的事。我看到的问题是
text='download'
以小写开头,而
中的文本以大写开头

首先将文本更改为
text='Download'
,看看它现在是否找到了您的元素。如果这就是问题所在,那么你可以使用像

text = 'ownload'
驱动程序。通过xpath((//*[包含(text(),“+text+”)]./*[@value='“+text+”]))查找元素(

忽略第一个字符

编辑:是的,您可以使其不区分大小写

driver.find_elements_by_xpath("(//*[contains(translate(text(), 'DOWNLOAD', 'download'), 'download')])")

因为您需要不区分大小写的匹配项和。另外,由于需要通配符匹配,因此需要使用
contains()
。而且,由于您还希望检查
id
href
属性以及文本:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.yourticketprovider.nl/LiveContent/tickets.aspx?x=492449&y=8687&px=92AD8EAA22C9223FBCA3102EE0AE2899510C03E398A8A08A222AFDACEBFF8BA95D656F01FB04A1437669EC46E93AB5776A33951830BBA97DD94DB1729BF42D76&rand=a17cafc7-26fe-42d9-a61a-894b43a28046&utm_source=PurchaseSuccess&utm_medium=Email&utm_campaign=SystemMails")

condition = "contains(translate(%s, 'DOWNLOAD', 'download'), 'download')"
things_to_check = ["text()", "@class", "@id", "@href"]
conditions = " or ".join(condition % thing for thing in things_to_check)

for elm in driver.find_elements_by_xpath("//*[%s]" % conditions):
    print(elm.text)

在这里,我们基本上是通过字符串格式和连接来构造表达式,对
text()
class
id
href
属性进行不区分大小写的检查,并将条件与

连接起来。您可以使用如下的translate函数,任何单词都不区分大小写:

driver.通过xpath(“/*[translate(text(),'abcdefghijklmnopqrstuvxyz','abcdefghijklmnopqrstuvxyz')='download'])查找元素

>>>驱动程序。通过xpath(“translate(text(),'abcdefghijklmnopqrstuvxyz','abcdefghijklmnopqrstuvxyz'”='download'])查找元素
[, ]

试试这个:

//*[(@id|@class|@href|text())
       [contains(translate(.,'DOWNLOAD','download'), 'download')]]
<html>
  <a id="downloadTop" class="navlink" 
    href="javascript:__doPostBack('downloadTop','')">Download</a>
  <b id="y" class="x_downLoad"/>
  <p>Nothing to do_wnLoad</p>
  <a class="m" href="www.DownLoad.com">Get it!</a>
  <b>dOwnlOad</b>
</html>
<a id="downloadTop" class="navlink" href="javascript:__doPostBack('downloadTop','')">Download</a>
<b id="y" class="x_downLoad"/>
<a class="m" href="www.DownLoad.com">Get it!</a>
<b>dOwnlOad</b>
此Xpath 1.0表达式选择:具有
id
href
属性或文本节点子元素的所有元素,其字符串值包含任何大小写中的字符串“download:”

这里是一个运行证明。下面的XSLT转换用于计算XPath表达式并将所有选定节点复制到输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "//*[(@id|@class|@href|text())
       [contains(translate(.,'DOWNLOAD','download'), 'download')]]
    "/>
  </xsl:template>
</xsl:stylesheet>

当我们将转换应用于以下测试文档时

//*[(@id|@class|@href|text())
       [contains(translate(.,'DOWNLOAD','download'), 'download')]]
<html>
  <a id="downloadTop" class="navlink" 
    href="javascript:__doPostBack('downloadTop','')">Download</a>
  <b id="y" class="x_downLoad"/>
  <p>Nothing to do_wnLoad</p>
  <a class="m" href="www.DownLoad.com">Get it!</a>
  <b>dOwnlOad</b>
</html>
<a id="downloadTop" class="navlink" href="javascript:__doPostBack('downloadTop','')">Download</a>
<b id="y" class="x_downLoad"/>
<a class="m" href="www.DownLoad.com">Get it!</a>
<b>dOwnlOad</b>

无事可做

下载
选中所需元素,然后将其复制到输出中

//*[(@id|@class|@href|text())
       [contains(translate(.,'DOWNLOAD','download'), 'download')]]
<html>
  <a id="downloadTop" class="navlink" 
    href="javascript:__doPostBack('downloadTop','')">Download</a>
  <b id="y" class="x_downLoad"/>
  <p>Nothing to do_wnLoad</p>
  <a class="m" href="www.DownLoad.com">Get it!</a>
  <b>dOwnlOad</b>
</html>
<a id="downloadTop" class="navlink" href="javascript:__doPostBack('downloadTop','')">Download</a>
<b id="y" class="x_downLoad"/>
<a class="m" href="www.DownLoad.com">Get it!</a>
<b>dOwnlOad</b>

下载

如果您仍然想要对
xpath
进行更多的泛化,并且不想使用
translate
函数,您可以使用
itertools.product
并生成字符串的所有变体
下载
作为
节点
文本属性,如下所示

from  itertools import  product
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.yourticketprovider.nl/LiveContent/tickets.aspx?x=492449&y=8687&px=92AD8EAA22C9223FBCA3102EE0AE2899510C03E398A8A08A222AFDACEBFF8BA95D656F01FB04A1437669EC46E93AB5776A33951830BBA97DD94DB1729BF42D76&rand=a17cafc7-26fe-42d9-a61a-894b43a28046&utm_source=PurchaseSuccess&utm_medium=Email&utm_campaign=SystemMails")
txt = 'Download' # text to be searched
#Generate variants of that txt
l = [(c, c.lower()) if not c.isdigit() else (c,) for c in txt.upper()] #make tuple of upper and lower of each lettern that string (Download)
variants = ["".join(item) for item in product(*l)] # make all variant of the string Download
anchors = ["text()", "@class", "@id", "@href"] #node attribute to be searched
#Generate xpaths
xpaths_or = " or ".join(["contains(%s,'%s')"%(i,j) for i in anchors for j in variants])
xpaths = "//*[%s]" %xpaths_or
for download_tag in driver.find_elements_by_xpath(xpaths):
    print(download_tag.text)
driver.quit()
输出-

Download
Download
注意
isdigit
功能可避免更改数字的大小写(若存在)

但在此页面上,即使存在以下链接,也不会返回任何结果:

<a id="downloadTop" class="navlink" href="javascript:__doPostBack('downloadTop','')">Download</a>
这是因为有不同的文字。看:

Download
download
一个字母是大写的。 因此,您需要使用不区分大小写的xpath:

driver.find_elements_by_xpath("(//*[contains(lower-case(text()), 'download')]")

它对你来说必须足够好

是的,你不能解析html并生成树结构,因为它不是一种常规语言。你甚至不能用正则表达式找到任意数量的开始括号和结束括号。但我不想在这种情况下找到结束标记,我只想按顺序找到所有开始标记,这是完全可行的这是可行的,只要这些标记没有出现在其他文本中,例如JavaScript中。问题是这一次它是“downloadTop”。然而,由于我正在构建一个scraper,我希望它更通用。因此我希望所有包含单词“download”的元素都不区分大小写。同样,包含
id=”的元素也不区分大小写下载“
id=“DOWNLOAD”
,并且还包含通配符,例如
id=“downloadthistuff”
,或
id=“yourldownloadisher”
。有什么办法吗?问题是我想定义它不区分大小写。同样,包含id=“DOWNLOAD”或id=“DOWNLOAD”的元素也不区分大小写还包含通配符,如id=“downloadthissuff”或id=“yourldownloadishelle”。有什么办法可以做到这一点吗?请注意,这使得本例中的动态XPath构造完全没有必要(您可能应该接受他的答案,认为这是最简单、最直接的)。