如何使用xpath抓取页面元素

How to scrape page element using xpath

我想使用 xpath 获取元素的电子邮件

<td>
<span id="A-1_id_1151_1997" class="">info@alexianer.com</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 但无法弄清楚。

请提供任何解决方案。

检查 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 具有 child 和 class 属性,其值为 tablehead 并且依次具有td child 依次有文本内容为“E-Mail”的任何 child——如果你找到这样的 table,得到第 7 个 td child 它的第 2 个 tr 后代。”

如果您只想获取包含特定 e-mail 地址的任何 td,您可以只检查整个节点的文本上下文是否与该特定 e-mail 地址相匹配,如果您只想获得第一个这样的匹配节点,请对整个表达式使用 [1] 位置谓词:

(//table[*[@class="tablehead"]/td/*[text()="E-Mail"]]//tr[2]/td[7][.="info@alexianer-aachen.de"])[1]