如何使用xpath刮取页面元素

时间:2015-12-24 12:01:36

标签: php curl web-scraping html-parsing scraper

我想使用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上,但无法弄清楚。

请提供任何解决方案。

1 个答案:

答案 0 :(得分: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个孩子反过来有任何孩子的文字内容为“table” - 如果你发现这样的td,请获得第二个tr后代的第7个td孩子。”

如果您只想获得包含特定电子邮件地址的任何[1],您只需检查整个节点的文本上下文是否与该特定电子邮件地址匹配,如果您只想查看得到第一个这样的匹配节点,对整个表达式使用(//table[*[@class="tablehead"]/td/*[text()="E-Mail"]]//tr[2]/td[7][.="info@alexianer-aachen.de"])[1] 位置谓词:

        question1.setRotation(180);
        RelativeLayout.LayoutParams for_question1_x = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
        for_question1_x.setMargins(935, 465, 0, 0);
        question1.setLayoutParams(for_question1_x);
        question1.requestLayout();