簡體   English   中英

使用 PHP DOMXpath 解析 HTML

[英]Parsing HTML with PHP DOMXpath

我想使用 PHP 和 DOMXpath 從外部網站檢索事件鏈接和文本。 外部網站html的結構如下;

<!-- first -->
<div class="col-sm-12 col-lg-3 me recording-item">
    <div class="recording-item-inner">
        <a class="col-sm-12 recording-name" href="/recordings/191">
        <div class="info">
            <b>Daily Event</b><br>
            <small>29 Jun 2020</small>
        </div></a>
    </div>
</div>
<!-- second -->
<div class="col-sm-12 col-lg-3 me recording-item">
    <div class="recording-item-inner">
        <a class="col-sm-12 recording-name" href="/recordings/190">
        <div class="info">
            <b>Daily Event B</b><br>
            <small>26 Jun 2020</small>
        </div></a>
    </div>
</div>
<!-- third -->
<div class="col-sm-12 col-lg-3 me recording-item">
    <div class="recording-item-inner">
        <a class="col-sm-12 recording-name" href="/recordings/189">
        <div class="info">
            <b>Daily Event C</b><br>
            <small>22 Jun 2020</small>
        </div></a>
    </div>
</div>

我正在嘗試檢索最新的 5 個事件名稱、日期和鏈接。 目前我可以使用下面的代碼獲取最新的(單個)事件。

<?php
function getEvents()
{

    $page = file_get_contents('https://example.com/events');
    $rootUrl = 'https://example.com';

    @$doc = new DOMDocument();
    @$doc->loadHTML($page);

    $xpath = new DomXPath($doc);

    $nodeList = $xpath->query("//div[@class='recording-item']");
    $node = $nodeList->item(0);

    $href = $xpath->evaluate("string(//div[@class='recording-item-inner']/a/@href)");
    $eventUrl = $rootUrl . $href;

    return $eventUrl;

}
?>

如何修改此代碼以檢索 5 個最近的事件詳細信息並打印出一個簡單的項目列表;

<ul>
  <li>Event 1 - [name], [date], [href]</li>
  <li>Event 2 - [name], [date], [href]</li>
  <li>Event 3 - [name], [date], [href]</li>
  <li>Event 4 - [name], [date], [href]</li>
  <li>Event 5 - [name], [date], [href]</li>
</ul>

可以做到,但由於 xpath 支持有限,這不是最優雅的解決方案。

$nodeList開始; 鑒於您的示例 xml 只有 3 個事件,此代碼將為 output 提供有關前兩個事件的所需信息。 顯然,您可以根據實際代碼對其進行修改:

$nodeList = $xpath->query('//div[./div[@class="recording-item-inner"]]//div[@class="info"]');
$i = 1;
echo htmlspecialchars("<ul>", ENT_QUOTES);
echo "<br>";
foreach($nodeList as $result) { 
   if ($i++ > 2) break;
   echo htmlspecialchars("<li>", ENT_QUOTES);
   echo "Event 1 - " . $result->childNodes[1]->textContent . ",   ";
   echo $result->childNodes[4]->textContent . ",   ";
   echo $result->parentNode->getAttribute('href');
   echo htmlspecialchars("</li>", ENT_QUOTES);   
   echo "<br>";
   }
echo htmlspecialchars("</ul>", ENT_QUOTES);

Output:

<ul>
<li>Event 1 - Daily Event, 29 Jun 2020, /recordings/191</li>
<li>Event 1 - Daily Event B, 26 Jun 2020, /recordings/190</li>
</ul>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM