如何使用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这一点。
实际上有在目标span
两个文本节点:第一个就是<input>
前一个空字符串和二线<input>
和(包含"option1"
一)你XPath
//span[contains(text(),'option1')]
意味着后在第一个文本节点中包含“option1”的返回范围。
您可以使用下面的表达式中的一个匹配所需input
:
//span[normalize-space()="option1"]/input[@type="radio"]
//span[contains(text()[2],'option1')]/input[@type='radio']
感谢您的解释 –
我想你不能在这里使用text()
。因为此函数返回当前span
元素的一系列子文本节点。有在您的示例2个文本节点:
<span>
<input type='radio'/>
option1
</span>
1文本节点是一个只包含一个换行符<span>
和<input type='radio'/>
之间。
第二文本节点是(在开始时以及在结尾)<input type='radio'/>
和含有option1
文本加2个换行符</span>
之间。
contains
函数需要一个字符串参数而不是一个序列。我认为它只需要序列中的第一个文本节点,它只包含一个换行符。
如果您需要选择input
其次,你可以使用下面的表达式一些text
节点:如果您需要选择span
包含文本option1
和input
与@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。
每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'
感谢您的输入。 –
试试这个选择选项1
//input[@type='radio']/preceding::span[1][contains(.,'option1')]
感谢您的回答 –
你可以指定你想要精确选择文本或输入标签? – PRMoureu
我正在查找输入标签。下面的建议xpath's为我工作 –