2017-09-04 403 views
1

我有一個單選按鈕與價值HTML如下:如何使用XPath選擇一個單選按鈕,然後選擇文本?

<div class='result'> 
<span> 
<input type='radio'/> 
option1 
</span> 
<span> 
<input type='radio'/> 
option2 
</span> 
<span> 
<input type='radio'/> 
option3 
</span> 
</div> 

我試過以下的XPath,但是這是行不通的:

//span[contains(text(),'option1')]/input[@type='radio'] 

請幫我寫的XPath這一點。

+1

你可以指定你想要精確選擇文本或輸入標籤? – PRMoureu

+0

我正在查找輸入標籤。下面的建議xpath's爲我工作 –

回答

1

實際上有在目標span兩個文本節點:第一個就是<input>前一個空字符串和二線<input>

和(包含"option1"一)你XPath//span[contains(text(),'option1')]意味着後在第一個文本節點中包含「option1」的返回範圍。

您可以使用下面的表達式中的一個匹配所需input

  1. //span[normalize-space()="option1"]/input[@type="radio"]
  2. //span[contains(text()[2],'option1')]/input[@type='radio']
+0

感謝您的解釋 –

0

我想你不能在這裏使用text()。因爲此函數返回當前span元素的一系列子文本節點。有在您的示例2個文本節點:

<span> 
<input type='radio'/> 
option1 
</span> 

1文本節點是一個只包含一個換行符<span><input type='radio'/>之間。

第二文本節點是(在開始時以及在結尾)<input type='radio'/>和含有option1文本加2個換行符</span>之間。

contains函數需要一個字符串參數而不是一個序列。我認爲它只需要序列中的第一個文本節點,它只包含一個換行符。

如果您需要選擇input其次,你可以使用下面的表達式一些text節點:如果您需要選擇span包含文本option1input@type='radio'

//input[@type='radio'][contains(following-sibling::text(), 'option1')] 

,你可以試試下面的表達式:

//span[contains(., 'option1') and input/@type='radio'] 

如果您需要選擇input代替span再使用後續荷蘭國際集團表示:

//span[contains(., 'option1')]/input[@type='radio'] 

我可以建議你以下資源來獲得關於XPath的一些信息。 W3C推薦標準包含XPath的完整描述。如果您使用XPath 2.0,那麼你可以看看:

有關的XPath 3.0看一看:

這些recomendations足夠大,很難閱讀。但是您可以在這些文檔中找到a list of all available axes,包括following-sibling::,a description of text(),a description of contains()

另外還有很多簡要的XPath教程。例如,你可以看看this one

+0

感謝您的解釋。你可以請我建議我一些網站,我可以找到/免費學習更多關於 –

+0

我已經添加資源列表到答案 – Denis

+0

感謝您附加資源 –

0

span有兩個文本元素。一個在input元素之前,一個在它後面,但第一個基本上是空的。

在此代碼中,我找到了input元素,然後是他們的父母,然後是父母的那些span的第二個文本元素。

>>> from scrapy.selector import Selector 
>>> selector = Selector(text=open('temp.html').read()) 
>>> for item in selector.xpath('.//input[@type="radio"]/../text()[2]'): 
...  item.extract() 
...  
'\noption1\n' 
'\noption2\n' 
'\noption3\n' 
+0

感謝您的輸入。 –

0

試試這個選擇選項1

//input[@type='radio']/preceding::span[1][contains(.,'option1')] 
+0

感謝您的回答 –

相關問題