使用 Waitr 从文本中排除 <span> 的内容
Excluding contents of <span> from text using Waitr
瓦提尔
mytext =browser.element(:xpath => '//*[@id="gold"]/div[1]/h1').text
Html
<h1>
This is the text I want
<span> I do not want this text </span>
</h1>
当我 运行 我的 Watir 代码时,它会选择所有文本,包括 span 中的内容。我如何只得到文本“这是我想要的文本”,而没有跨度文本?
最好从尝试避免使用 XPath 开始。 Watir 最强大的功能之一是能够在没有 XPath 语法的情况下创建复杂的定位器。
问题是在节点上调用文本会获取该节点内的所有内容。您需要执行以下操作:
top_level = browser.element(id: 'gold')
h1_text = top_level.h1.text
span_text = top_level.h1.span.text
desired_text = h1_text.chomp(span_text)
如果你有一个更复杂的 HTML,我发现使用 Nokogiri 可以更容易地处理这个问题,因为它提供了更多的方法来解析 HTML:
require 'nokogiri'
h1 = browser.element(:xpath => '//*[@id="gold"]/div[1]/h1')
doc = Nokogiri::HTML.fragment(h1.html)
mytext = doc.at('h1').children.select(&:text?).map(&:text).join.strip
这对于顶级文本很有用。
如果只有一个h1,可以省略id
@b.h1.text.remove(@b.h1.children.collect(&:text).join(' '))
或有更多则指定
@b.h1(id: 'gold').text.remove(@b.h1.children.collect(&:text).join(' '))
将其设为一个方法并使用 get_top_text(@b.h1)
从您的脚本中调用它以获取它
def get_top_text(el)
el.text.chomp(@b.h1.children.collect(&:text).join(' '))
end
瓦提尔
mytext =browser.element(:xpath => '//*[@id="gold"]/div[1]/h1').text
Html
<h1>
This is the text I want
<span> I do not want this text </span>
</h1>
当我 运行 我的 Watir 代码时,它会选择所有文本,包括 span 中的内容。我如何只得到文本“这是我想要的文本”,而没有跨度文本?
最好从尝试避免使用 XPath 开始。 Watir 最强大的功能之一是能够在没有 XPath 语法的情况下创建复杂的定位器。 问题是在节点上调用文本会获取该节点内的所有内容。您需要执行以下操作:
top_level = browser.element(id: 'gold')
h1_text = top_level.h1.text
span_text = top_level.h1.span.text
desired_text = h1_text.chomp(span_text)
如果你有一个更复杂的 HTML,我发现使用 Nokogiri 可以更容易地处理这个问题,因为它提供了更多的方法来解析 HTML:
require 'nokogiri'
h1 = browser.element(:xpath => '//*[@id="gold"]/div[1]/h1')
doc = Nokogiri::HTML.fragment(h1.html)
mytext = doc.at('h1').children.select(&:text?).map(&:text).join.strip
这对于顶级文本很有用。
如果只有一个h1,可以省略id
@b.h1.text.remove(@b.h1.children.collect(&:text).join(' '))
或有更多则指定
@b.h1(id: 'gold').text.remove(@b.h1.children.collect(&:text).join(' '))
将其设为一个方法并使用 get_top_text(@b.h1)
从您的脚本中调用它以获取它
def get_top_text(el)
el.text.chomp(@b.h1.children.collect(&:text).join(' '))
end