标签: xpath

XPATH查询中的特殊字符

我使用以下内容XPATH Query列出网站下的对象.ListObject[@Title='SomeValue'].SomeValue是动态的.只要SomeValue没有撇号('),此查询就会起作用.尝试使用转义序列.没工作.

我究竟做错了什么?

c# java xml xpath

40
推荐指数
4
解决办法
4万
查看次数

如何使用Javascript计算元素的XPath位置?

假设我有一个包含不同类型标签的大型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

html javascript xml jquery xpath

40
推荐指数
5
解决办法
3万
查看次数

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')]"

xml xpath

40
推荐指数
2
解决办法
7万
查看次数

HtmlAgilityPack并选择节点和子节点

希望有人可以帮助我.

假设我有一个包含多个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有关.

有人知道解决方案吗?我已经玩了很多,我现在完全糊涂了:) …

c# xpath html-agility-pack

40
推荐指数
2
解决办法
7万
查看次数

Python:在特定元素上本地使用xpath

我正试图从带有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 lxml

39
推荐指数
1
解决办法
1万
查看次数

Xpath就像查询嵌套的python词典一样

有没有办法为嵌套的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]这个问题和接受的答案是古老的.较新的答案可能比原始答案更好地完成工作.但是我没有测试它们所以我不会改变接受的答案.

python xpath jmespath json-path-expression

39
推荐指数
6
解决办法
2万
查看次数

HtmlAgilityPack选择childNodes不符合预期

我试图使用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属性(如果存在)?

.net c# asp.net xpath html-agility-pack

38
推荐指数
3
解决办法
2万
查看次数

如何从XDocument获取NameTable?

如何从XDocument获取NameTable?

它似乎没有XmlDocument具有的NameTable属性.

编辑:从缺乏答案来判断,我猜我可能会忽略这一点.

我正在对像这样的XDocument进行XPath查询...

document.XPathSelectElements("//xx:Name", namespaceManager);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我必须手动将我想要使用的命名空间添加到XmlNamespaceManager,而不是像使用XmlDocument一样从XDocument中检索现有的命名表.

c# xml xpath linq-to-xml

38
推荐指数
3
解决办法
2万
查看次数

从XPath中的选择中排除某些元素

我知道这是一个简单的问题,但我无法弄清楚.考虑以下简单的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)

(这不是诀窍)

xml xpath

38
推荐指数
3
解决办法
4万
查看次数

如何正确使用XPath previous-sibling

我正在使用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)

selenium xpath selenium-ide

38
推荐指数
1
解决办法
15万
查看次数