我正在使用 Selenium / Python3 抓取网站,该网站仅使用无效的选择器,例如:

<input id="egg:bacon:SPAM" type="text"/>
<input id="egg:sausages:SPAM:SPAM" type="text"/>

(无效部分是egg:bacon:SPAMegg:sausages:SPAM:SPAM

我确实尝试使用以下方法选择这些标签:

driver.find_element_by_css_selector('input#egg:bacon:SPAM')

但当然我得到selenium.common.exceptions.InvalidSelectorException


我也尝试使用 xpath 来获取我的标签,它适用于:

driver.find_element_by_xpath('//input[@id="egg:bacon:SPAM"]')

但我的代码是基于一个基于 CSS 选择器的自制库。 添加 XPATH 支持需要添加约 200 行代码(不包括单元测试、文档等),仅用于处理这种错误而非通用行为。

另外,抓取这个网站是一个更大项目的一部分,只有这个特定的网站使用那种 CSS 选择器,在 10 上为单个网站付出这么多的努力让我感到不舒服。


我可以使用find_element_by_css_selector('.foo > input:nth-child(2)')但它非常棘手,DOM 上的任何小更新都可能破坏刮板。

是否有任何干净的方法可以使用find_element_by_css_selector通过 Selenium 处理无效的 css 选择器,还是我注定要为此网站使用 XPATH?

#1楼 票数:2 已采纳

它们都有效。 您需要转义特殊字符或使用引号:

driver.find_element_by_css_selector('input[id="egg:bacon:SPAM"]')
driver.find_element_by_css_selector('input#egg\:bacon\:SPAM')

#2楼 票数:1

要标识具有包含保留字符的id属性的元素,例如egg:bacon:SPAMegg:sausages:SPAM:SPAM您可以使用带有以下通配符的动态

  • ^ : 表示属性值
  • * : 表示一个属性值包含
  • $ :表示属性值

解决方案

您可以使用以下解决方案:

  • 要识别元素<input id="egg:bacon:SPAM" type="text"/>

     driver.find_element_by_css_selector("input[id^='egg'][id*='bacon'][id$='SPAM']")
  • 要识别元素<input id="egg:sausages:SPAM:SPAM" type="text"/>

     driver.find_element_by_css_selector("input[id^='egg'][id*='sausages'][id$='SPAM']")

参考

您可以在以下位置找到一些相关讨论:

  ask by Arount translate from so

未解决问题?本站智能推荐:

1回复

我尝试使用css选择器、id、class和xpath来使用pythonselenium定位按钮,但最终出现NoSuchElement错误[重复]

这个问题在这里已经有了答案: 使用 Chrome 时的硒“selenium.common.exceptions.NoSuchElementException” (1 个回答)
1回复

如何使用seleniumpython在日期选择器上单击活动日?

所以页面上有多个日历(日期选择器),我设法点击了所需的日历。 我想单击活动日期(当前日期)。 class="day active" 单击所需的日历字形后如何找到此元素? PS,当我为此复制选择器时 - 我得到了 当我检查元素并搜索 td.day.active 时,我能够找到该元素。 所以我使
2回复

在Selenium中的众多findElement(s)/By函数中,您何时会使用一个而不是另一个?

Selenium 包括 findElement 函数,就像这样...... .find_element_by_ 很明显,由于 HTML 页面的创建方式,有些受设计限制,例如 id、link_text、name、tag_name,因为并非所有标签都可能包含 id、link_text 等……但是,c
4回复

如何使用Selenium检查属性是否存在并获取其值(如果存在)?

我迭代了一个谷歌表单调查并尝试放置一些内容(为了以防万一,我试图让它看起来像一个引用)。 然而,有些领域是年龄,不允许像这样超过 99 岁: 所以我在我的代码中添加了一个条件来尝试查看我必须写的元素上是否有“max”属性: 但它不起作用:
1回复

如何使用selenium更改元素类属性值

我丢失了凭据..所以我正在创建这个新线程。 这里有一个老问题,如果它有帮助: 如何点击按钮与python投票 我想改变这一行: 对此: 所以投票设置改变vote-link up vote-link up voted 。 但问题是,在该网站中,有几个项目要投票,而“数据 - 水龙
1回复

Selenium-使用element.click()时出现过时的元素引用异常

错误输出: 我试图用硒做以下事情: 去亚马逊 搜索用python自动化无聊的东西 点击第一个产品标题 如果价格标签元素在产品网站上,请打印并返回上一页 如果不可用,请返回上一页 转到下一个产品标题并从第 4 步开始重复但是它在click()失败代码:def experiment2(): br
2回复

使用Selenium遍历CSS选择器时无效或非法的选择器

我正在尝试使用Selenium遍历表上的一堆行,但发现尝试这样做时出现错误。 该代码应循环并捕获变量中的每一行,然后将其与我的参考变量进行比较,但会引发错误,指示我添加了无效或非法的选择器。 请在下面找到我的代码:
2回复

CSS选择器在Selenium脚本中引发超时异常

追溯(最近一次通话):文件“ C:\\ Users \\ PSWN672P \\ AppData \\ Local \\ Programs \\ Python \\ Python37 \\ Python program \\ SNOW1.py”,第17行,位于EC.element_to_be_