簡體   English   中英

枚舉HTML字符串中的HREF項目

[英]Enumerating A HREF items inside a string of HTML

我正在嘗試從HTML字符串枚舉超鏈接列表(特別是HREF組件)。 每個頁面的內容與Yahoo的早期版本看起來相距不太遠(一系列的超鏈接按LI和UL標簽分為分組。

我們正在從舊系統中解析一系列以前手工制作的HTML頁面,並且希望僅從每個頁面中提取有意義的內容,而不是遷移整個字符串。 在測試中,我的過程很簡單,如下所示:

  • 將html頁面的內容加載到字符串中
  • 解析內容以尋找“ A”對象,但僅在分配了特定類的特定標簽之后
  • 對於找到的每個列表,回顯(用於測試)URL(並將該項目最終寫入我們的數據庫)。

我相當確定做到這一點的最佳方法是使用正則表達式,但是從我在堆棧溢出中發現的示例中,我無法使它們正常工作(即使回顯找到的匹配項)也沒有太大的成功使用DOM解析器。

我的測試數據如下所示:

<html>
<body>
<li><a href='beforelist.com'></a></li>
<ul class="summary">
<li><a href='test.com'></a></li>
<li><a href='test2.com'></a></li>
<li><a href='etc.com'></a></li>
</ul>
<li><a href='afterlist.com'></a></li>
<img src='/test.png'>
</body>
</html>

並且正在尋找匹配的輸出(僅在找到class ='summary'之后:

 test.com
 test2.com
 etc.com

摘要分組之外的所有內容都將被忽略,並且對其可能包含的內容非常不可預測。 我確定我缺少明顯的東西,非常感謝您的協助! 我從未真正理解過如何正確編寫正則表達式模式。 :)

使用DOMDocumentDOMXPath永遠不會使用正則表達式解析HTML。

這是您的情況的一個簡單示例:

// Create new DOM
$dom = new DOMDocument();
// Import your HTML string into DOM
$dom->loadHTML($html);

// Create new XPath which has the above DOM as resource
$xpath = new DOMXPath($dom);

// Find every ul with class summary and select all the "a"s in it
$links = $xpath->query("//ul[@class='summary']//a");

// Loop through the links
foreach($links as $link) {
    // Print out the href attribute
    var_dump($link->getAttribute('href'));
}

這個PHP小片段的輸出是:

string 'test.com' (length=8)
string 'test2.com' (length=9)
string 'etc.com' (length=7)

真的很容易。 XPath查詢將找到類summary為無序列表的任何鏈接。 即使是嵌套列表。

帶有解釋的代碼:

<?php
// to retrieve selected html data, try these DomXPath examples:

$html="<html>
<body>
<li><a href='beforelist.com'></a></li>
<ul class='summary'>
<li><a href='test.com'></a></li><li><a href='test2.com'></a></li><li><a href='etc.com'></a></li>
</ul>
<li><a href='afterlist.com'></a></li>
<img src='/test.png'>
</body>
</html>";
$doc = new DOMDocument;
$doc->loadHTML($html);

$xpath = new DOMXpath($doc);

// example 1: for everything with an id
//$elements = $xpath->query("//*[@id]");

// example 2: for node data in a selected id
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']");

// example 3: what you are looking for
$elements = $xpath->query("//ul[@class='summary']//li/a");

if (!is_null($elements)) {
  foreach ($elements as $element) {
    echo $element->getAttribute('href'). "\n";

  }
}
?>

演示在這里: https : //eval.in/173506

暫無
暫無

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

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