如何通过嵌套在XPath其他元素中的CSS类找到元素?

问题描述:

我想提取复杂选择器中的所有链接,如 - .timestream .ui-ContentBottom h1 a。我知道如何与像像a只是一个单一的选择简单的链接做到这一点:如何通过嵌套在XPath其他元素中的CSS类找到元素?

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$nodes = $xpath->query('//a/@href'); 
foreach($nodes as $href) { 
    echo $href->nodeValue; 
} 

我是新来的XPath所以任何帮助,将不胜感激。

以下XPath表达式应该为你工作:

//*[contains(@class, "timestream")]//*[contains(@class, "ui-ContentBottom")]//h1//a/@href 

的这里的问题是,XPath不具有天然class选择。换句话说,contains(@class, "smth").smth不完全相同,但实际上,它通常用于匹配多值类属性值中的单个类。另请参见:

+0

请你提供一个链接,我可以阅读有关使用复杂xPath查询的更多信息?谢谢:) –

+0

@SanJeetSingh不能回忆任何具体的东西,只是谷歌搜索XPath教程,练习和练习更多!乐意效劳。 – alecxe

xpath可以让你搜索一个文件,如XML或HTML文件。

xpath不会显示路径中的类,但会显示带有@符号的ID。

xpath可以通过几种方式获得。 Chrome中的一种方式是查看元素的来源,右键单击它并单击Copy XPath

当我这样做对textarea的盒子,我在回答这个问题之前,我收到以下XPath ::

//*[@id="wmd-input"] 

不要让,虽然迷惑你。这里是一个更简单的例子

/html/body 

这是body元素的xpath。

我写了一个小函数,可以帮助您将xpaths转换为元素。

function xpath(path){ 
    for (var found, x = document.evaluate(path, document, null, XPathResult.ANY_TYPE, null), result = []; found = x.iterateNext();) { 
     result.push(found); 
    } 
    return result; 
} 

此功能产生针对该文本区域::

xpath('//*[@id="wmd-input"]'); 
[<textarea id=​"wmd-input" class=​"wmd-input processed" name=​"post-text" cols=​"92" rows=​"15" tabindex=​"101" data-min-length>​</textarea>​] 

运行它时,现在,你有元素,你可以修改它这样的例子如下:

var test = xpath('/html/body'); 
test[0].innerHTML='bye';