2015-12-24 70 views
0

湊頁面元素我想使用XPath如何使用XPath

<td> 
<span id="A-1_id_1151_1997" class="">[email protected]</span> 
</td> 

我已經嘗試了許多代碼,其中一人獲得元素的郵件是這樣的

$html = new DOMDocument(); 
@$html->loadHtmlFile('http://www.deutsches-krankenhaus-verzeichnis.de/suche/Krankenhaus/260530089-00-1.1/Alexianer-Aachen-GmbH.jsf'); 
$xpath = new DOMXPath($html); 
$nodelist = $xpath->query('//*[@id="accordion"]/table[4]/tbody/tr[2]/td[7]'); 
foreach ($nodelist as $n){ 
echo $n->nodeValue."\n"; 

如果我使用ID,然後在電子郵件正在顯示,但TD標記不顯示,因爲頁面是動態的,ID在每個頁面上都發生變化。我認爲問題是與nodeValue,但無法弄清楚。

請提供任何解決方案。

+0

Xpath是不好的選擇,使用CSS選擇器從HTML中提取數據。例如td> span – Vicky

回答

1

檢查http://www.deutsches-krankenhaus-verzeichnis.de/suche/Krankenhaus/260530089-00-1.1/Alexianer-Aachen-GmbH.jsf在我看來,你可以抓住你,與類似下面的XPath表達式需要的節點:

//table[*[@class="tablehead"]/td/*[text()="E-Mail"]]//tr[2]/td[7] 

也就是說,翻譯成散文,「找到具有與孩子的任何table一個class屬性,其值是tablehead和這反過來又一個孩子td這反過來又具有其文本內容是任何一個孩子「E-Mail」 -and如果你找到了這樣的table,獲得第7 td孩子第二tr後代的吧。 「

如果您只想獲取包含特定電子郵件地址的任何td,則只需檢查整個節點的文本上下文是否與該特定電子郵件地址相匹配,並且如果您只想獲取第一個這樣的匹配節點,使用[1]位置謂詞對整個表達式:

(//table[*[@class="tablehead"]/td/*[text()="E-Mail"]]//tr[2]/td[7][.="[email protected]"])[1] 
+0

您的答案顯示您的輝煌。確切的電子郵件即將到來,唯一的問題是其他電子郵件來了。 – Adas

+0

也想知道如何找到「class = tablehead」,因爲這個類已經重複過。 – Adas

+0

關於「只有問題是其他電子郵件正在出現」,請參閱我的更新回答。 – sideshowbarker