繁体   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