如何在节点中选择文本是否在另一个标记内

时间:2016-01-24 19:23:23

标签: html ruby xpath

我正在尝试编写一个xpath选择器来提取可能在span内部或不在<p class='out'> <span>John</span> </p> <p class='out'> Alice </p> <p class='out'> <span>Tim</span> </p> <p class='out'> Doe </p> <p class='out'> <span>Tina</span> </p> <p class='out'> Joseph </p> 内的名称,即来自以下两个片段:

//p/span/text()

我能够为个别案例写作,但我如何为两者做这些?

这是我的尝试:

<asp:ModalPopupExtender ID="mdlMessageBox" BackgroundCssClass="modalBackground" runat="server" TargetControlID="hdnField1" <asp:ImageButton ID="ImageLetterCopy" OnClick="ImageLetterCopy_Click" style="max-width: 100%;max-height: 100%" runat="server" />

3 个答案:

答案 0 :(得分:0)

您可以使用OR - &gt; |运营商以实现您的要求

尝试以下内容: -

 //p[not(self::span)] | /span

希望它会对你有所帮助:)。

答案 1 :(得分:0)

你可以使用类似下面的东西,它不是纯粹的XPath解决方案,因为我在结果上应用了一些处理:

XPath.each(xmldoc, "//p/span/text()|//p/text()").map(&:to_s).map(&:strip).reject(&:empty?)

如果可以从输入中删除新行,则可以避免其他处理

xmldoc = Document.new(html.split("\n").join)
XPath.match(xmldoc, "//p/span/text()|//p/text()")

工作样本如下所示:

require 'rexml/document'
include REXML

html = <<-eos
<html>

<p class='out'>
<span>John</span>
</p>

<p class='out'>
Alice
</p>

<p class='out'>
<span>Tim</span>
</p>

<p class='out'>
Doe
</p>

<p class='out'>
<span>Tina</span>
</p>

<p class='out'>
Joseph
</p>

</html>
eos

xmldoc = Document.new(html)
XPath.each(xmldoc, "//p/span/text()|//p/text()").map(&:to_s).map(&:strip).reject(&:empty?)
#=> ["John", "Tim", "Tina", "Alice", "Doe", "Joseph"]

答案 2 :(得分:0)

如果span并非总是存在,则不要将其用作路标。

我会使用类似的东西:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<p class='out'>
<span>John</span>
</p>

<p class='out'>
Alice
</p>
EOT

doc.search('p.out').map(&:text)
# => ["\nJohn\n", "\nAlice\n"]

如果绝对必须是XPath,那么使用:

doc.search('//p[@class="out"]').map(&:text)
# => ["\nJohn\n", "\nAlice\n"]

除非必须,否则我不使用XPath。 CSS在大多数情况下会产生更多可读选择器,可读性会降低维护。

这是如何运作留给读者的练习。