2016-01-24 11 views
-2

我想寫一個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()

+5

我們希望看到您嘗試的XPath。詢問但不顯示你的嘗試使它看起來像你希望我們爲你寫,而不是幫你修復你的工作。這也導致我們在黑暗中拍攝,試圖猜測你知道什麼,沒有嘗試過什麼,從而導致對廣泛問題的廣泛回答。請閱讀「[問]」和「[mcve]」。 –

+0

使用'|'操作符 –

+0

@TheTinMan沒有包含它,因爲它非常簡單。不知道Xpath足夠的搜索來獲得我正在尋找的,這就是爲什麼發佈這個。可能這可能很簡單。 –

回答

0

您可以使用OR - >|運營商來實現您的要求

嘗試類似如下: -

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

希望它會幫助你:)

+0

我想選擇通用名稱;不只是愛麗絲。 –

+0

你可以分享更多的HTML代碼或xpath,它是單獨爲你工作 –

+0

只需添加更多的HTML;我需要一個可以選擇所有名字的xpath選擇器。 –

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"] 
+0

謝謝,但有可能獲得文本沒有進一步操作使用Ruby? –

+0

這可能是,但經過一個小時的研究 - 我無法弄清楚。由於'text()'值中有新的行'\ n',所以需要額外的處理 - 如果你可以確保在輸入中沒有'\ n',那麼可能不需要額外的處理。 –

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在大多數情況下會產生更易讀的選擇器,並且可讀性會降低維護。

這是如何工作的,作爲讀者的練習。

+0

謝謝!它是一個非常好的指針,但我使用xpath的原因是因爲我從HTML表中提取值。 –

相關問題