在 PHP 中使用 XPath 获取 href-attributes

Getting href-attributes using XPath in PHP

我是 PHP 的新手,正在尝试为网站编写 scraper

我正在尝试获取具有 class 名称类别的元素。我用过

$showPage = '<li class="categories">Categories<ul>  <li class="cat-item cat-item-940"><a href="http://www.desitvbox.me/category/star-plus/amul-taste-of-india/" >Amul Taste of India</a>
</li>
    <li class="cat-item cat-item-942"><a href="http://www.desitvbox.me/category/star-plus/dance-plus/" >Dance Plus</a>
</li>
    <li class="cat-item cat-item-239"><a href="http://www.desitvbox.me/category/star-plus/diya-aur-baati-hum-star/" >Diya Aur Baati Hum</a>
</li>
    <li class="cat-item cat-item-745"><a href="http://www.desitvbox.me/category/star-plus/suhani-si-ek-ladki/" >Suhani Si Ek Ladki</a>
</li>
    <li class="cat-item cat-item-147"><a href="http://www.desitvbox.me/category/star-plus/star-plus-completed-shows/" >Star Plus Completed Shows</a>
<ul class="children">
    <li class="cat-item cat-item-772"><a href="http://www.desitvbox.me/category/star-plus/star-plus-completed-shows/airlines/" >Airlines</a>
</li>
    <li class="cat-item cat-item-518"><a href="http://www.desitvbox.me/category/star-plus/star-plus-completed-shows/arjun/" >Arjun</a>
</li>
    <li class="cat-item cat-item-237"><a href="http://www.desitvbox.me/category/star-plus/star-plus-completed-shows/chef-pankaj-ka-zayka/" >Chef Pankaj Ka Zayka</a>
</li>
</ul>
</li>
</ul></li>';   
$dom = new DOMDocument();
$dom->validateOnParse = true;
$dom->loadHTML($showPage);  
$dom->preserveWhiteSpace = false;

$allShowsList = new DOMXPath($dom);
$allShowsTableHTML = $allShowsList->query('//li[contains(@class, "categories")]'); 

但是,我现在想读取 $allShowsTableHTML 中提到的所有 href 的值。

你能告诉我该怎么做吗?

正如你所见,一条记录也有 ul class = 'childern'。我也想看

我需要获取 href 和标题。

我已经尝试了下面但没有结果。

$allShowTableDom = new DOMDocument();
foreach ($allShowTableHTML as $showLink)
{
    $allShowTableDom->appendChild($allShowTableDom->importNode($showLink,true));
} 
$showsArray = $allShowsTableHTML->getElementsByTagName('a');

我认为它不会进入 foreach 循环。

要获取超链接的所有 href 属性,请添加更多轴步骤,最后遍历结果列表,其中 ->value 属性 将包含 URI。

鉴于您可以将所有 href 属性转储到整个 <li> 元素中,只需将查询扩展 //a/@href:

$document = new DOMXPath($dom);
$hrefs = $document->query('//li[contains(@class, "categories")]//a/@href'); 

foreach ($hrefs as $href) {
  echo $href->value;
}

如果其中包含您不想获取的节点,您还可以使用更具体的查询来下降包含未排序列表和 select:

//li[contains(@class, "categories")]/ul/li/a/@href