我使用以下内容XPATH Query
列出网站下的对象.ListObject[@Title='SomeValue']
.SomeValue是动态的.只要SomeValue没有撇号('),此查询就会起作用.尝试使用转义序列.没工作.
我究竟做错了什么?
假设我有一个包含不同类型标签的大型HTML文件,类似于您现在正在查看的StackOverflow.
现在让我们说你单击页面上的一个元素,Javascript函数会是什么样的,它会计算引用该特定元素的最基本的XPath?
我知道在XPath中有一种无限的方式来引用该元素,但我正在寻找一些只关注DOM树的东西,而不考虑ID,类等.
例:
<html>
<head><title>Fruit</title></head>
<body>
<ol>
<li>Bananas</li>
<li>Apples</li>
<li>Strawberries</li>
</ol>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
假设您点击苹果.Javascript函数将返回以下内容:
/html/body/ol/li[2]
Run Code Online (Sandbox Code Playgroud)
它基本上只是向上运行DOM树一直到HTML元素.
只是为了澄清,'on-click'事件处理程序不是问题.我能做到这一点.我只是不确定如何计算元素在DOM树中的位置并将其表示为XPath.
PS赞赏使用或不使用JQuery库的任何答案.
PPS我对XPath完全不熟悉,所以我甚至可能在上面的例子中犯了一个错误,但你会明白这个想法.
编辑于2010年8月11日:看起来有人问了一个类似的问题:为选定的textnode生成/获取Xpath
我试图在'/ doc/story/content'下搜索包含文本'Yahoo'的节点,它返回'content'节点,但我需要包含'Yahoo'或它的父节点的精确文本节点
<doc>
<story>
<content id="201009281450332423">
<ul>MSW NYNES NYPG1 DILMA</ul>
<p> <k> Yahoo, made </k> it nice </p>
<p>
<author>-v-</author>
</p>
</content>
</story>
</doc>
Run Code Online (Sandbox Code Playgroud)
Xpath的: "/doc/story/content[contains(., 'Yahoo')]"
希望有人可以帮助我.
假设我有一个包含多个div的html文档,如下例所示:
<div class="search_hit">
<span prop="name">Richard Winchester</span>
<span prop="company">Kodak</span>
<span prop="street">Arlington Road 1</span>
</div>
<div class="search_hit">
<span prop="name">Ted Mosby</span>
<span prop="company">HP</span>
<span prop="street">Arlington Road 2</span>
</div>
Run Code Online (Sandbox Code Playgroud)
我正在使用HtmlAgilityPack来获取html文档.我需要知道的是我如何获得每个"search_hit"-div的跨度?
我的第一个想法是这样的:
foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
{
}
}
Run Code Online (Sandbox Code Playgroud)
每个div应该是包含spans作为属性的对象.I. e.
public class Record
{
public string Name { get; set; }
public string company { get; set; }
public string street { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后填写此清单:
public List<Record> Results = new List<Record>();
Run Code Online (Sandbox Code Playgroud)
但我正在使用的XPATH并没有在子节点中进行搜索,因为它应该这样做.它接缝一遍又一遍地搜索整个文档.
我的意思是我已经让它以这种方式工作,我只是得到整个页面的跨度.但后来我在跨度和div之间没有任何关系.意思是:我不知道哪个跨度与哪个div有关.
有人知道解决方案吗?我已经玩了很多,我现在完全糊涂了:) …
我正试图从带有xpath的页面获取链接.问题是我只想要表中的链接,但是如果我在整个页面上应用xpath表达式,我将捕获我不想要的链接.
例如:
tree = lxml.html.parse(some_response)
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")
Run Code Online (Sandbox Code Playgroud)
问题是将表达式应用于整个文档.我找到了我想要的元素,例如:
tree = lxml.html.parse(some_response)
root = tree.getroot()
table = root[1][5] #for example
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")
Run Code Online (Sandbox Code Playgroud)
但这似乎也在整个文档中执行查询,因为我仍在捕获表外的链接.此页面显示"当在元素上使用xpath()时,将针对元素(如果是相对的)或针对根树(如果是绝对的)评估XPath表达式:".那么,我使用的是绝对表达式,我需要使它相对吗?是吗?
基本上,我怎样才能只过滤此表中存在的元素?
有没有办法为嵌套的python词典定义XPath类型查询.
像这样的东西:
foo = {
'spam':'eggs',
'morefoo': {
'bar':'soap',
'morebar': {'bacon' : 'foobar'}
}
}
print( foo.select("/morefoo/morebar") )
>> {'bacon' : 'foobar'}
Run Code Online (Sandbox Code Playgroud)
我还需要选择嵌套列表;)
这可以通过@ jellybean的解决方案轻松完成:
def xpath_get(mydict, path):
elem = mydict
try:
for x in path.strip("/").split("/"):
try:
x = int(x)
elem = elem[x]
except ValueError:
elem = elem.get(x)
except:
pass
return elem
foo = {
'spam':'eggs',
'morefoo': [{
'bar':'soap',
'morebar': {
'bacon' : {
'bla':'balbla'
}
}
},
'bla'
]
}
print xpath_get(foo, "/morefoo/0/morebar/bacon")
Run Code Online (Sandbox Code Playgroud)
[编辑2016]这个问题和接受的答案是古老的.较新的答案可能比原始答案更好地完成工作.但是我没有测试它们所以我不会改变接受的答案.
我试图使用HtmlAgilityPack库来解析页面中的一些链接,但我没有看到我期望从这些方法得到的结果.在下面我有一个HtmlNodeCollection的链接.对于每个链接,我想检查是否有图像节点,然后解析其属性,但linkNode的SelectNodes和SelectSingleNode方法似乎在搜索父文档而不是linkNode的childNodes给出了什么?
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");
}
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以获得linkNode的image childnode的alt属性(如果存在)?
如何从XDocument获取NameTable?
它似乎没有XmlDocument具有的NameTable属性.
编辑:从缺乏答案来判断,我猜我可能会忽略这一点.
我正在对像这样的XDocument进行XPath查询...
document.XPathSelectElements("//xx:Name", namespaceManager);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我必须手动将我想要使用的命名空间添加到XmlNamespaceManager,而不是像使用XmlDocument一样从XDocument中检索现有的命名表.
我知道这是一个简单的问题,但我无法弄清楚.考虑以下简单的XML文档:
<root>
<a></a>
<b></b>
<c></c>
<a></a>
<d></d>
<e></e>
<a></a>
<a></a>
</root>
Run Code Online (Sandbox Code Playgroud)
什么是选择节点的最佳方式<b>
通过<e>
使用XPath?
我正在寻找类似的东西
/root/*[not(a)]
Run Code Online (Sandbox Code Playgroud)
(这不是诀窍)
我正在使用Selenium IDE为我的网站编写测试,我在使用previous-sibling点击按钮时遇到了麻烦
<td>
<div class="btn-group">
<button class="btn btn btn-danger block" title="Warning, Delete" name="delete" type="button">
<button class="btn btn btn-default block" title="View History" name="history" type="button">
<button class="btn btn btn-default block" title="View Settings" name="settings" type="button">
<button class="btn btn btn-default block" name="device" type="button">
<span class="glyphicon glyphicon-pencil"/>
Arcade Reader
</button>
</div>
</td>
Run Code Online (Sandbox Code Playgroud)
我自己的路
xpath=//button[contains(.,'Arcade Reader')]/../preceding-sibling::button[@name='settings']
Run Code Online (Sandbox Code Playgroud) xpath ×10
xml ×5
c# ×4
python ×2
.net ×1
asp.net ×1
html ×1
java ×1
javascript ×1
jmespath ×1
jquery ×1
linq-to-xml ×1
lxml ×1
selenium ×1
selenium-ide ×1