如何使用XPath选择一个单选按钮,然后选择文本?

问题描述:

我有一个单选按钮与价值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为我工作 –

实际上有在目标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

感谢您的解释 –

我想你不能在这里使用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

感谢您附加资源 –

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

感谢您的输入。 –

试试这个选择选项1

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

感谢您的回答 –