【问题标题】:How can I get the element of a-tag in the div class with selenium?如何使用硒在 div 类中获取 a-tag 的元素?
【发布时间】:2021-07-14 07:07:43
【问题描述】:

我最近从事的项目是我必须从特定网站获取元素。

我想获取下面的文本元素。

<div class="block-content">
  <div class="block-heading">
    <a href="https://www~~~~~~">  
      <i class="fa fa-map">
        ::before
      </i>
       "Text I want to get"
    </a>
  </div>
</div>

我一直在尝试解决这个问题,但我找不到任何正常工作。

如果你能帮助我,我会爱你。

谢谢。

【问题讨论】:

  • 您必须定位哪个节点? a?如上所示,我想真正被双引号包围的文本?而::before 真的在i 标签内吗?你能确认我吗?
  • 谢谢你问我。为了准确起见,它确实被双引号包围,并且 ::before 在 i 标记内。看起来 i 标签只有一个图标。这一次,我需要得到文本。上面的“我想获取的文本”。
  • @Abel 你试过我的解决方案了吗?
  • 好的。您想定位哪个元素?您的目标是提取“我想要获取的文本”的刺痛?
  • @Eliyahu 我一直在努力。我尝试使用我首先在页面中找到的 xpath 获取文本,但它不起作用。 @driver.find_element(:xpath, "/html/body/div[2]/div[2]/div[2]/div[2]/div/div[1]/a/text()")跨度>

标签: html ruby selenium


【解决方案1】:

根据您提供的信息,您要查找的文本位于 a 元素内,因此该元素的 xpath 类似于:
//a[contains(@href,'https://www')]
但由于其中还有 i 元素,因此从 a 元素中获取文本将为您提供包含在 a 本身和 i 中的文本。
因此,您应该从i 获取文本,这看起来只是一个 (空格),并从您从a 收到的文本中减少它。
如果您想对其中包含 href 和 i 元素的所有 a 元素执行此操作,您可以使用以下 xpath:
//a[@href and ./i]
如果您要查找的元素有更具体的定义 - 我提到的 xpath 应该相应更新

【讨论】:

  • 谢谢。不幸的是,我将在许多页面中获取位于此处的元素,这意味着我无法使用 XPATH 选择特定的 URL。这是否意味着我不能做你提到的事情?
  • 如果该元素具有某些共同的唯一属性或与其他永久元素相关的相同相对位置,您可以在该元素每次出现时使用它。否则它不是同一个元素,你必须每次都找到/定义它。
  • 非常感谢您的帮助。显然,似乎没有与我上面提到的结构完全相同的结构,我的意思是嵌套在块内容中的块标题中的结构。所以我希望它是独一无二的。
  • 没有看到您正在使用的网站,我看不出那里是否有一些通用的方法。根据您提供的信息,我已尽力为您提供帮助。
  • 还是谢谢你。我认为不允许在此处粘贴特定站点的 URL。网站在下面,文字是中间部分,在这个网站上写着汽车。 truck-bank.net/modules/truck/…
【解决方案2】:

从您的评论中,我了解到您想要提取该文本。所以这里是你的代码,可以提取你想要的文本。

Selenium::WebDriver::Wait
  .new(timeout: 60)
  .until { !driver.find_element(xpath: "//i[@class='fa fa-map-marker']/..").text.empty? }

p driver.find_element(xpath: "//i[@class='fa fa-map-marker']/..").text[/(?<=before \")\w+ \w+ \w+ \w+ \w+/]

输出

"Text I want to get"

【讨论】:

  • 非常感谢您对我的帮助,因为我已经为此工作了一周,遇到像您这样的人让我感到支持。不幸的是,我无法使用您给我的代码获取文本,但我得到了一些元素。 find_element(xpath: "//i[@class='fa fa-map']/..").用你写的闲散代码,我什么也没得到。我可能不得不让你知道的唯一变化是类的名称更准确地说是这个“fa fa-map-marker”。但我想这并没有太大的区别。
  • @Abel i 与类名精确 fa fa-map-marker 只给出一个元素,而不是你之前提到的元素列表
  • @Abel 正在打印空字符串?
  • @Rajagopalan 是的......我很抱歉,即使你告诉我很多,我也无法解决它。结果什么也没有……
  • @Abel 别担心,这是意料之中的,因为程序甚至在标签正确加载之前就执行了。我已经更新了代码。现在试试。它会起作用的。
【解决方案3】:

我无法直接获得我想要的元素,所以这就是我所做的。 只是我确实用一些方法修改了元素。

  def seller_name
    shop_info_elements = @driver.find_elements(:class_name, "block-content")
    shop_info_text= shop_info_elements.first.text
    shop_info_text_array = shop_info_text.lines
    seller_name = shop_info_text_array.first.chomp
    seller_name
  end

它并不漂亮,但它可以用于同一站点上的任何其他页面。

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2018-07-04
    相关资源
    最近更新 更多