我正在尝试使用php从网页中提取特定类型的链接
链接就像是......
http://www.example.com/pages/12345667/some-texts-available-here
我想提取上述格式的所有链接。
maindomain.com/pages/somenumbers/sometexts
到目前为止,我可以从网页中提取所有链接,但上面的过滤器没有发生。我怎么能实现这个目标呢?
有什么建议吗?
<?php
$html = file_get_contents('http://www.example.com');
//Create a new DOM document
$dom = new DOMDocument;
@$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');
//Iterate over the extracted links and display their URLs
foreach ($links as $link){
//Extract and show the "href" attribute.
echo $link->nodeValue;
echo $link->getAttribute('href'), '<br>';
}
?>
答案 0 :(得分:2)
您可以使用DOMXPath并使用DOMXPath::registerPhpFunctions
注册一个函数,以便在XPATH查询之后使用它:
function checkURL($url) {
$parts = parse_url($url);
unset($parts['scheme']);
if ( count($parts) == 2 &&
isset($parts['host']) &&
isset($parts['path']) &&
preg_match('~^/pages/[0-9]+/[^/]+$~', $parts['path']) ) {
return true;
}
return false;
}
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile($filename);
$xp = new DOMXPath($dom);
$xp->registerNamespace("php", "http://php.net/xpath");
$xp->registerPhpFunctions('checkURL');
$links = $xp->query("//a[php:functionString('checkURL', @href)]");
foreach ($links as $link) {
echo $link->getAttribute('href'), PHP_EOL;
}
通过这种方式,您只能提取所需的链接。
答案 1 :(得分:0)
这是一个小小的猜测,但如果我弄错了你仍然可以看到这样做的方法。
foreach ($links as $link){
//Extract and show the "href" attribute.
If(preg_match("/(?:http.*)maindomain\.com\/pages\/\d+\/.*/",$link->getAttribute('href')){
echo $link->nodeValue;
echo $link->getAttribute('href'), '<br>';
}
}
答案 2 :(得分:0)
您已经使用了解析器,因此您可以前进并在DOM上使用xpath查询。 XPath查询也提供starts-with()
之类的函数,因此这可能有效:
$xpath = new DOMXpath($dom);
$links = $xpath->query("//a[starts-with(@href, 'maindomain.com')]");
之后循环遍历:
foreach ($links as $link) {
// do sth. with it here
// after all, it is a DOMElement
}