2015-09-28 131 views
1

我想提取複雜選擇器中的所有鏈接,如 - .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所以任何幫助,將不勝感激。

回答

0

以下XPath表達式應該爲你工作:

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

的這裏的問題是,XPath不具有天然class選擇。換句話說,contains(@class, "smth").smth不完全相同,但實際上,它通常用於匹配多值類屬性值中的單個類。另請參見:

+0

請你提供一個鏈接,我可以閱讀有關使用複雜xPath查詢的更多信息?謝謝:) –

+0

@SanJeetSingh不能回憶任何具體的東西,只是谷歌搜索XPath教程,練習和練習更多!樂意效勞。 – alecxe

0

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'; 
相關問題