给定以下 XML,什么 XPath 返回所有 prop
属性中包含 Foo
的元素(前三个节点):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
给定以下 XML,什么 XPath 返回所有 prop
属性中包含 Foo
的元素(前三个节点):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
//a[contains(@prop,'Foo')]
如果我使用这个 XML 来获取结果,它就能正常工作。
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
编辑: 另一件需要注意的事情是,虽然上面的XPath将返回该特定XML的正确答案,但如果您想要保证仅获取元素“bla”中的“a”元素,则应按照其他人提到的方法使用
/bla/a[contains(@prop,'Foo')]
这将在整个xml文档中搜索所有的"a"元素,而不管它们是否嵌套在"blah"元素中。
//a[contains(@prop,'Foo')]
为了做到全面,并秉承Stack Overflow的精神,我添加了这句话。 :)
xidel http://popurls.com/ --extract '//a[contains(@href,'/go/pop')]/@href'
- chovy这个 XPath 将会返回所有包含 'Foo' 的属性的节点,无论节点名或者属性名是什么:
//attribute::*[contains(., 'Foo')]/..
当然,如果你更关心属性本身的内容,而不是它们所在的父节点,那就去掉 /..。//attribute::*[contains(., 'Foo')]
//@*[contains(., 'Foo')]
。 - aliopi@href
是 attribute::href
的简写。 - Huy Phạmdescendant-or-self::*[contains(@prop,'Foo')]
或者:/bla/a[contains(@prop,'Foo')]
或者:
/bla/a[position() <= 3]
解析:
descendant-or-self::
轴 - 可以搜索其下的每个节点以及节点本身。通常最好使用此术语,而不是 // 。我曾遇到过一些实现中 // 表示任何位置(根节点的后代或自身)。其他情况下则使用默认轴。
* or /bla/a
Tag标签是一种通配符匹配,而/bla/a是一个绝对路径。
[contains(@prop,'Foo')] or [position() <= 3]
[ ]内的条件。@prop是属性::prop的简写,因为attribute是另一个搜索轴。或者您可以使用position()函数选择前3个。
你尝试过这样的方法吗:
//a[contains(@prop, "Foo")]
我以前从未使用过contains函数,但我认为它应该像广告中所说的那样工作...
约翰C最接近了,但XPath是区分大小写的,因此正确的XPath应该是:
/bla/a[contains(@prop, 'Foo')]
如果你也需要匹配链接本身的内容,请使用text():
//a[contains(@href,"/some_link")][text()="点击这里"]
/bla/a[contains(@prop, "foo")]
试试这个:
//a[contains(@prop,'foo')]
这应该适用于文档中的任何"a"标签。
你也可以这样使用:
a[@class='specific-class-name' and contains(@href,'/link/to/something')]
这意味着一个带有属性 href 的 a 标签包含特定单词,不要忘记在属性名称前使用@。