如何使用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]
我想使用 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]