【问题标题】:How can I search for text in a specific part of a webpage in Selenium (Python) ? With pictures:如何在 Selenium (Python) 网页的特定部分搜索文本?带图片:
【发布时间】:2021-02-16 18:23:40
【问题描述】:

所以我一直在尝试在 python 中使用 selenium 在网页上搜索特定关键字,但似乎无法弄清楚如何在特定区域中搜索特定文本。如图所示,当我在 chrome 中搜索“Sim”这个词时,突出显示了几个点。红色区域是我在其中寻找代码的唯一地方。我使用 xpath 来识别文本,因为它们没有其他可用的地方。

这是目前为止的代码:

else:
    print("Nothing here yet 1")
    if driver.find_elements_by_xpath("//*[contains(text(), 'Sim')]"):
        login_to_reply = driver.find_element_by_xpath("//body/div[@id='app']/main/div[@id='content']/div/div/div/div/div/div/article/header[1]")
        login_to_reply.click()                         
        time.sleep(5)

如果有人可以帮助并让我知道我不明白的地方,我将不胜感激,谢谢。

【问题讨论】:

  • 使用元素的基于文本的 HTML 更新问题。
  • 是什么让您的红色圆圈区域与页面上的其他 cmets/帖子不同? - 是特定作者的吗?还没回复吗?您是否要检查[仅页面上的第一篇文章]?你想要[在“sim”被提及的页面上的第一篇文章]页面吗?还是其他? - 这些都可以通过 xpaths 实现,你只需要澄清你需要什么 :-)
  • @DebanjanB 我添加了更多细节和类似页面的另一个示例,community.giffgaff.com/d/33231984-referred-a-friend

标签: python selenium xpath search text


【解决方案1】:

根据cmets中的附加信息,在页面的FIRST POST中搜索关键字可以使用以下xpath:

(//article)[1]//div[@class='Post-body'][contains(normalize-space(),'point')]

关键位是:(//article)[1] - 它将更多标识符锁定在位于article 标记的第一个[1] 内。其余的只是减少 dom 中的重复,并找到您的文本,无论嵌套标签是结构化的。

基于the link provided,仅匹配顶部帖子。您可以看到搜索关键字“point”仅获得 1 次点击,即使它在多个帖子中...

文本 'point' 可以换成 'sim' 或任何你想过滤的东西。


看了你的代码,我还有一些建议:

1/ 您用于“登录回复”的第二个 xpath 不是很好。像这样的长期复制的 xpath 通常是易碎且麻烦的。您可以使用与上述相同的技术单击该文章框中的回复:

(//article)[1]//button[span[text()='Reply']]

2/

您还需要注意,这条线不会像您预期的那样工作。

 if driver.find_elements_by_xpath("//*[contains(text(), 'Sim')]"):

如果未找到该元素,它不会返回 false - 它会返回 NoSuchElement 异常并使脚本失败(并停止)。

您需要将其设为try/except block

它需要看起来像这样:

try:
    driver.find_elements_by_xpath("(//article)[1]//div[@class='Post-body'][contains(normalize-space(),'point')]"):
    login_to_reply = driver.find_element_by_xpath("(//article)[1]//button[span[text()='Reply']]")
    login_to_reply.click()
    time.sleep(5)
except:
    print("Text was not found")

我没有运行这个,但如果它不起作用,请告诉我,我会再看一遍。

【讨论】:

  • 是的!你“尝试:driver.find_elements_by_xpath("(//article)[1]//div[@class='Post-body'][contains(normalize-space(),'point')]"): login_to_reply = driver.find_element_by_xpath("(//article)[1]//button[span[text()='Reply']]") login_to_reply.click() time.sleep(5) except: print("Text was not找到“)”代码就像一个魅力,谢谢!在旁注中,考虑到我只搜索一个关键字,我必须对此代码进行哪些更改才能一起搜索两个关键字,例如搜索“sim”和“broken”,然后从那里得到响应?
  • 要添加更多关键字,请在末尾添加更多方括号。例如对于任意顺序的 2 个关键词: driver.find_elements_by_xpath("(//article)[1]//div[@class='Post-body'][contains(normalize-space(),'sim')] [contains(normalize-space(),'broken')]")
  • 谢谢您,非常感谢您的帮助。括号中的关键字是否包括答案的大写和小写?例如。如果有人因为不正确的语法而在他们的答案中写了“sIm”,那么考虑到关键字是“(normalize-space(),'sim')”,代码还会继续吗?
  • 在旁注中,我似乎收到此错误“引发异常类(消息,屏幕,堆栈跟踪,警报文本)selenium.common.exceptions.UnexpectedAlertPresentException:警报文本:{警报文本:消息:意外警报打开: {Alert text : }" 有时当我运行我的代码时。这到底是什么意思?
  • 警报表示页面上有警报。您需要切换到它并清除它。您偶尔会说,但您可能会发现它发生在您访问的特定页面或特定时间。如果您不确定在 chrome javascript:(alert("I am an alert")) 的地址栏中会显示什么警报,或者查看此站点:w3schools.com/jsref/met_win_alert.asp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2020-11-02
  • 2022-01-25
  • 2012-10-25
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多