【发布时间】:2012-04-11 07:18:03
【问题描述】:
我在DOMDocument 和DOMXPath 中获得了所需的HTML 数据。
但我需要访问和检索某些<a> 标签中的href 值。以下是标准:
href包含:some-site.vendor.com/jobs/[#idnumber]/job(即some-site.vendor.com/jobs/23094/job)href不包含:some-site.vendor.com/jobs/search?search=pr2href不包含:some-site.vendor.com/jobs/introhref不包含:www.someothersite.com/href不包含:media.someothersite.com/href不包含:javascript:void(0)
这些(类似)查询中的任何一个都可以获取除 4-6 之外的所有内容 - 这是一件好事:
$joblinks = $xpath->query('//a[@href[contains(., "https://some-site.vendor.com/jobs/")]]');
$joblinks = $xpath->query('//a[@href[contains(., "job")]]');
但最终我需要访问所有包含 href 的锚标记,如 #1,并将实际的 href 值分配给变量/数组。这就是我正在做的事情:
$payload = fetchRemoteData(SPEC_SOURCE_URL);
// suppress warning(s) due to malformed markup
libxml_use_internal_errors(true);
// load the fetched contents
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML($payload);
// parse and cache the required data elements
$xpath = new DOMXPath($dom);
//$joblinks = $xpath->query('//a[@href[contains(., "some-site.vendor.com/jobs/")]]');
$joblinks = $xpath->query('//a[@href[contains(., "job")]]');
foreach($joblinks as $joblink) {
var_dump(trim($joblink->nodeValue)); // dump hrefs here!
}
echo "\n";
这真的让我很生气 - 我很接近,但我似乎无法正确调整查询和/或访问实际的 href 值。如果我没有遵循这个问题的任何协议,我最谦虚的道歉......
任何/所有帮助将不胜感激!非常感谢!
【问题讨论】:
-
是否有必要仅使用 XPath 查询过滤 href 值?我确信这是可能的,但是看着它我头疼(典型的 XPath)。也许您可以使用
$xpath->query()来获取与广泛模式匹配的节点列表(例如,href="https://some-site.vendor.com/jobs/"),然后使用几行 PHP 来更深入地检查每个节点的 href 值? -
XPath 1.0而不是XPath 1.1肯定会让这变得不必要地冗长......但这就是我们所拥有的一切。我将创建一个可以与registerphpfunctions进行正则表达式匹配的函数。