我有一个HTML表格,其结构如下:
<tr>
<td class='tablesortcolumn'>atest</td>
<td >Kunde</td>
<td ><a href="">email@example.com</a></td>
<td align="right"><a href="module/dns_reseller/user_edit.php?ns=3&uid=6952"><img src="images/iconedit.gif" border="0"/></a> <img src="images/pixel.gif" width="2" height="1" border="0"/> <a href="module/dns_reseller/user.php?delete=true&uid=6952" onclick="return confirm('Möchten Sie den Datensatz wirklich löschen?');"><img src="images/icontrash.gif" border="0"/></a></td>
</tr>
这些tr
块有数百个。
我想提取atest
和email@example.com
我尝试了以下内容:
$document = new DOMDocument();
$document->loadHTML($data);
$selector = new DOMXPath($document);
$elements = $selector->query("//*[contains(@class, 'tablesortcolumn')]");
foreach($elements as $element) {
$text = $element->nodeValue;
print($text);
print('<br>');
}
提取atest没问题,因为我可以使用tablesortcolumn
类获取元素。我怎样才能收到电子邮件地址?
我不能简单地使用//table/tr/td/a
因为网站上有其他元素是这样构造的。所以我需要通过选择一个空的href标签来获得它。我已经尝试了//table/tr/td/a[contains(@href, '')]
,但它返回与//table/tr/td/a
有没有人知道如何解决这个问题?
答案 0 :(得分:2)
你可以尝试运行包含字符串@
的xpath吗?这似乎不太可能用于其他任何事情。
这样的事情可能会起作用
//*[text()[contains(.,'@')]]
答案 1 :(得分:1)
如果您要查找电子邮件字段,可以使用正则表达式。 Here是一篇可能有用的文章。
修改强>
根据NisseEngström的说法,我将把文章的有趣部分放在这里,以防博客失败。谢谢你的建议。
// Supress XML parsing errors (this is needed to parse Wikipedia's XHTML)
libxml_use_internal_errors(true);
// Load the PHP Wikipedia article
$domDoc = new DOMDocument();
$domDoc->load('http://en.wikipedia.org/wiki/PHP');
// Create XPath object and register the XHTML namespace
$xPath = new DOMXPath($domDoc);
$xPath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');
// Register the PHP namespace if you want to call PHP functions
$xPath->registerNamespace('php', 'http://php.net/xpath');
// Register preg_match to be available in XPath queries
//
// You can also pass an array to register multiple functions, or call
// registerPhpFunctions() with no parameters to register all PHP functions
$xPath->registerPhpFunctions('preg_match');
// Find all external links in the article
$regex = '@^http://[^/]+(?<!wikipedia.org)/@';
$links = $xPath->query("//html:a[ php:functionString('preg_match', '$regex', @href) > 0 ]");
// Print out matched entries
echo "Found " . (int) $links->length . " external linksnn";
foreach($links as $linkDom) { /* @var $entry DOMElement */
$link = simplexml_import_dom($linkDom);
$desc = (string) $link;
$href = (string) $link['href'];
echo " - ";
if ($desc && $desc != $href) {
echo "$desc: ";
}
echo "$href\n";
}
答案 2 :(得分:1)
以下XPath表达式完全符合您的要求
//*[@class = 'tablesortcolumn' or contains(text(),'@')]
使用您显示的输入文档将产生(单个结果由-------------
分隔):
<td class="tablesortcolumn">atest</td>
-----------------------
<a href="">email@example.com</a>
答案 3 :(得分:0)
如果您使用的是Chrome,则可以在控制台中测试XPath查询,如下所示:
$x("//*[contains(@class, 'tablesortcolumn')]")