问题:您如何在PHP中解析和处理HTML / XML?

如何解析HTML / XML并从中提取信息?

标签:php,xml,parsing,xml-parsing,html-parsing

回答1:

本地XML扩展

我更喜欢使用原生XML扩展之一,因为它们是捆绑在一起的PHP,通常比所有第3方库都快,并为我提供了所需的标记控制权。

DOM

DOM扩展使您可以通过PHP 5通过DOM API对XML文档进行操作。它是W3C的Document Object Model Core Level 3的实现,它是一种与平台和语言无关的界面,允许程序和脚本动态地进行操作。访问和更新文档的内容,结构和样式。

DOM能够解析和修改实际(损坏的)HTML,并且可以执行 XPath查询< / a>。它基于 libxml

使用DOM需要花一些时间,但是IMO值得花时间。由于DOM是与语言无关的接口,因此您会找到许多语言的实现,因此,如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的DOM API。

一个基本用法示例可在获取A元素的href属性和总体概念概述,请参见 php中的DOMDocument

如何使用DOM扩展已在StackOverflow上广泛讨论,因此如果您选择使用它,可以确保可以通过搜索/浏览堆栈溢出来解决遇到的大多数问题。

XMLReader

XMLReader扩展是XML提取解析器。阅读器充当光标,在文档流上前进并在途中的每个节点处停止。

XMLReader与DOM一样,也是基于libxml的。我不知道如何触发HTML解析器模块,因此使用XMLReader解析损坏的HTML的机会可能不如使用DOM健壮,因为您可以明确地告诉它使用libxml的HTML解析器模块。

一个基本用法示例可以在获得使用PHP的h1标记中的所有值

XML解析器

此扩展允许您创建XML解析器,然后为不同的XML事件定义处理程序。每个XML解析器还具有一些可以调整的参数。

XML解析器库也基于libxml,并实现了 SAX 样式的XML推送解析器。与DOM或SimpleXML相比,内存管理可能是更好的选择,但与XMLReader实现的请求解析器相比,使用它会更加困难。

SimpleXml

SimpleXML扩展提供了一个非常简单易用的工具集,可以将XML转换为可以使用常规属性选择器和数组迭代器处理的对象。

当您知道HTML是有效的XHTML时,可以选择SimpleXML。如果您需要解析损坏的HTML,甚至不用考虑SimpleXml,因为它会阻塞。

一个基本用法示例可以在用于CRUD节点和xml文件的节点值的简单程序,并且有 PHP手册中的许多其他示例


第三方库(基于libxml)

如果您喜欢使用第三方库,建议您使用实际上使用 DOM / libxml 放在下面,而不是字符串解析。

FluentDom -回购

FluentDOM为PHP中的DOMDocument提供了类似jQuery的流畅XML接口。选择器以XPath或CSS编写(使用CSS到XPath转换器)。当前版本扩展了DOM的实现标准接口,并增加了DOM Living Standard的功能。 FluentDOM可以加载JSON,CSV,JsonML,RabbitFish等格式。可以通过Composer安装。

HtmlPageDom

Wa72 \ HtmlPageDom是一个PHP库,可使用它轻松处理HTML文档。它需要 Symfony2组件中的DomCrawler 遍历DOM树并通过添加处理HTML文档DOM树的方法对其进行扩展。

phpQuery (多年未更新)

phpQuery是服务器端可链接的CSS3选择器驱动的文档对象模型(DOM)API,它基于用PHP5编写的jQuery JavaScript库,并提供了附加的命令行界面(CLI)。

另请参阅: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom提供了用于处理DOM文档和结构的工具。当前,我们提供Zend_Dom_Query,它提供了一个统一的接口,用于同时使用XPath和CSS选择器查询DOM文档。

QueryPath

QueryPath是一个用于处理XML和HTML的PHP​​库。它不仅可以与本地文件一起使用,而且还可以与Web服务和数据库资源一起使用。它实现了许多jQuery接口(包括CSS样式的选择器),但为服务器端使用做了很大的调整。可以通过Composer安装。

fDOMDocument

fDOMDocument扩展了标准DOM以在所有错误情况下都使用异常,而不是PHP警告或通知。他们还添加了各种自定义方法和快捷方式,以方便使用并简化DOM的使用。

sabre / xml

sabre / xml是一个包装和扩展XMLReader和XMLWriter类的库,以创建简单的"从XML到对象/数组"的映射系统和设计模式。读写XML是单次通过,因此速度很快,并且在大型xml文件上所需的内存较少。

FluidXML

FluidXML是一个PHP库,用于使用简洁流畅的API来处理XML。它利用XPath和流畅的编程模式来使游戏变得有趣而有效。


第三方(不是基于libxml的)

基于DOM / libxml的好处是,由于您基于本机扩展,因此可以立即获得良好的性能。但是,并非所有第3方库都遵循这条路线。下面列出了其中的一些

PHP简单HTML DOM解析器

  • 用PHP5 +编写的HTML DOM解析器使您能够以非常简单的方式操作HTML!
  • 需要PHP 5 +。
  • 支持无效的HTML。
  • 使用jQuery之类的选择器在HTML页面上查找标签。
  • 单行从HTML提取内容。

我通常不建议使用此解析器。代码库太可怕了,解析器本身也很慢并且占用大量内存。并非所有的jQuery选择器(例如子选择器)都是可行的。任何基于libxml的库都应该容易地胜过它。

PHP HTML解析器

PHPHtmlParser是一个简单,灵活的html解析器,它使您可以使用任何CSS选择器(如jQuery)来选择标签。目标是协助开发工具,这些工具需要快速,简便的方式来废弃html,无论它是否有效!该项目最初由sunra / php-simple-html-dom-parser支持,但该支持似乎已停止,因此该项目是我对他先前工作的改编。

同样,我不建议使用此解析器。 CPU使用率很高时,速度相当慢。也没有清除创建的DOM对象的内存的功能。这些问题在嵌套循环中尤为严重。该文档本身不准确且拼写错误,自16年4月14日以来未对修复程序做出任何反应。

Ganon

  • 通用令牌生成器和HTML / XML / RSS DOM解析器
    • 能够操纵元素及其属性
    • 支持无效的HTML和UTF8
  • 可以对元素执行类似CSS3的高级查询(例如jQuery-支持名称空间)
  • HTML美化器(如HTML Tidy)
    • 缩小CSS和Javascript
    • 排序属性,更改字符大小写,正确缩进等
  • 可扩展
    • 使用基于当前字符/令牌的回调解析文档
    • 将操作分成较小的功能,以便于覆盖
  • 快速简便

从未使用过它。无法判断是否有好处。


HTML 5

您可以使用以上内容来解析HTML5,但可能会有怪癖。因此,对于HTML5,您想考虑使用专用的解析器,例如

html5lib

基于WHATWG HTML5规范的HTML解析器的Python和PHP实现,以实现与主要桌面Web浏览器的最大兼容性。

HTML5完成后,我们可能会看到更多专用的解析器。 W3也有一个博客帖子,标题为 HTML 5的操作方法解析,值得一试。


WebServices

如果您不想编写PHP,也可以使用Web服务。通常,我发现这些工具的实用性很小,但这只是我和我的用例。

ScraperWiki

ScraperWiki的外部接口使您可以提取想要在Web上或在自己的应用程序中使用的形式的数据。您还可以提取有关任何刮板状态的信息。


正则表达式

最后(最不推荐),您可以使用正则表达式从HTML提取数据。通常不建议在HTML上使用正则表达式。

您可以在网上找到与标记匹配的大多数代码片段。在大多数情况下,它们仅适用于非常特殊的HTML。微小的标记更改(例如在某处添加空格,在标签中添加或更改标签中的属性)会使RegEx在编写不正确时失败。在HTML上使用RegEx之前,您应该知道自己在做什么。

HTML解析器已经知道HTML的语法规则。必须为您编写的每个新RegEx教授正则表达式。 RegEx在某些情况下还可以,但实际上取决于您的用例。

可以编写更可靠的解析器,但是使用上述正则表达式编写完整且可靠的自定义解析器会浪费时间,因为上述库已经存在并且在此方面做得更好。

另请参见解析HTML的Cthulhu方式< / a>


书籍

如果您想花一些钱,请看

我与PHP Architect或作者无关。

回答2:

尝试 简单HTML DOM解析器

  • 用PHP 5+编写的HTML DOM解析器,可让您以非常简单的方式操作HTML!
  • 需要PHP 5 +。
  • 支持无效的HTML。
  • 使用jQuery之类的选择器在HTML页面上查找标签。
  • 单行从HTML提取内容。
  • 下载


示例:

如何获取HTML元素:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


如何修改HTML元素:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


从HTML中提取内容:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


抓取Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

回答3:

只需使用 DOMDocument-> loadHTML()并完成它。 libxml的HTML解析算法非常好且快速,并且与流行的看法相反,它不会阻止格式错误的HTML。

回答4:

为什么不应该和何时应该使用正则表达式?

首先,一个常见的误称:正则表达式不适用于" 解析" HTML。但是,正则表达式可以" 提取" 数据。提取是他们的目的。与适当的SGML工具包或基准XML解析器相比,正则表达式HTML提取的主要缺点是它们在语法上的努力和可靠性的变化。

考虑使用可靠的HTML提取正则表达式:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

与简单的phpQuery或QueryPath相比,可读性更差:

$div->find(".stationcool a")->attr("title");

但是在特定的用例中它们可以提供帮助。

  • 许多DOM遍历前端并没有显示HTML注释 ,但是注释有时是提取时更有用的锚点。特别是伪HTML变体<$var>或SGML残基很容易与正则表达式相适应。
  • 通常,正则表达式可以节省后期处理。但是,HTML实体通常需要手动维护。
  • 最后,对于诸如提取,它们实际上是一个可能的工具。相对于SGML / XML解析器的速度优势主要体现在这些非常基本的提取过程中。

有时甚至建议使用正则表达式/ (.+?) /预提取HTML片段并进行处理其余的使用更简单的HTML解析器前端。

注意:我实际上有这个应用,交替使用XML解析和正则表达式。就在上周,PyQuery解析中断,而正则表达式仍然有效。是的,很奇怪,我自己也无法解释。但是,事情确实发生了。
所以,请不要因为现实世界中的正则表达式与regex = evil meme不匹配而否决它。 但我们也不要对此投票太多。只是该主题的旁注。

回答5:

phpQuery QueryPath 在复制流畅的jQuery API方面极为相似。这就是为什么它们是在PHP中正确解析HTML的最简单的两种方法。

QueryPath示例

基本上,您首先从HTML字符串创建可查询的DOM树:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

结果对象包含HTML文档的完整树表示。可以使用DOM方法遍历它。但是常见的方法是像在jQuery中那样使用CSS选择器:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

大多数情况下,您想为->find()使用简单的#id.classDIV标记选择器。但是,您也可以使用 XPath 语句,这些语句有时会更快。另外,典型的jQuery方法(例如->children()->text(),尤其是->attr())简化了提取正确的HTML代码段的过程。 (并且已经对其SGML实体进行了解码。)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath还允许将新标记注入到流中(->追加),然后输出并美化一个更新的文档(->writeHTML)。它不仅可以解析格式错误的HTML,还可以解析各种XML方言(带有名称空间),甚至可以从HTML微格式(XFN,vCard)提取数据。

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

phpQuery或QueryPath?

通常,QueryPath更适合于文档处理。尽管phpQuery还实现了一些伪AJAX方法(仅HTTP请求),以使其更类似于jQuery。据说phpQuery通常比QueryPath更快(因为总体功能较少)。

有关差异的更多信息,请参见在tagbyte.org 的回溯计算机上进行的比较。 (原始资源丢失了,所以这里是一个互联网存档链接。是的,您仍然可以找到丢失的页面,人们。)

这是综合QueryPath简介

优势

  • 简单性和可靠性
  • 易于使用的替代方法->find("img,对象,diva")
  • 正确的数据转义(与正则表达式grepping相比)

回答6:

简单的HTML DOM是一个很棒的开源解析器:

simplehtmldom.sourceforge

它以面向对象的方式处理DOM元素,并且新的迭代涵盖了很多不兼容的代码。还有一些很棒的功能,就像您在JavaScript中看到的一样,例如" find"功能,该功能将返回该标记名称的所有元素实例。

我已经在许多工具中使用了此工具,并在许多不同类型的网页上对其进行了测试,并且我认为它的效果很好。

回答7:

这里没有提到的一种通用方法是通过整洁,可以将其设置为吐出保证有效的XHTML。然后,您可以在其上使用任何旧的XML库。

但是对于您的特定问题,您应该看一下这个项目: http://fivefilters.org/仅内容/ -它是可读性算法,该算法旨在从页面中仅提取文本内容(而不是页眉和页脚)。

回答8:

对于1a和2:我将投票支持新的Symfony Componet类DOMCrawler( DomCrawler )。此类允许类似于CSS选择器的查询。看一下此演示文稿中的真实示例: news-of-the -symfony2-world

该组件旨在独立运行,可以在不使用Symfony的情况下使用。

唯一的缺点是,它仅适用于PHP 5.3或更高版本。

回答9:

顺便说一下,这通常称为屏幕抓取。我为此使用的库是简单的HTML Dom解析器

回答10:

我们之前已经为我们的需求创建了许多爬虫。归根结底,通常最简单的正则表达式可以做到最好。尽管上面列出的库因其创建的原因而很有用,但是如果您知道要查找的内容,则正则表达式是更安全的选择,因为您还可以处理无效的 HTML / XHTML 结构,如果通过大多数解析器加载,将会失败。

回答11:

我推荐 PHP简单HTML DOM解析器

它确实具有不错的功能,例如:

foreach($html->find('img') as $element)
       echo $element->src . '<br>';

回答12:

这听起来像是对W3C XPath 技术的很好的任务描述。表达诸如"返回嵌套在 元素 中的img标记中的所有href属性之类的查询很容易。 "不是PHP爱好者,我无法告诉您XPath可用的形式。如果可以调用外部程序来处理HTML文件,则应该可以使用XPath的命令行版本。有关快速介绍,请参见 http://en.wikipedia.org/wiki/XPath

回答13:

使用DOM而不是字符串解析的SimpleHtmlDom的第三方替代品: phpQuery Zend_Dom QueryPath FluentDom

回答14:

是的,您可以使用simple_html_dom。但是,我已经对simple_html_dom进行了大量工作,尤其是对于Web抓取,并且发现它过于脆弱。它可以完成基本工作,但我还是不会推荐它。

我从没有用过卷曲来达到目的,但我了解到卷曲可以更有效地完成工作,并且更加牢固。

请查看以下链接: scraping-websites-with-curl

回答15:

QueryPath 很好,但是请注意"跟踪状态",因为如果您没有意识到这意味着什么,那可能意味着您浪费了大量的调试时间来尝试找出发生的情况以及为什么代码不起作用。

这意味着对结果集的每次调用都会修改对象中的结果集,它不可链接,就像在jquery中那样,其中每个链接都是一个新集合,您只有一个集合,这是查询的结果,每个函数调用会修改该单个集合。

为了获得类似jquery的行为,您需要在执行类似filter / modify的操作之前进行分支,这意味着它将更加紧密地反映jquery中发生的事情。

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results现在包含input[name='forename']的结果集,而不是原始查询"divp"我经常发现, QueryPath 跟踪过滤器和查找的内容以及修改结果并将其存储在对象中的所有内容。您需要这样做

$forename = $results->branch()->find("input[name='forname']")

然后$results将不会被修改,并且您可以一次又一次地重用结果集,也许某个有更多知识的人可以澄清一下,但是从我的角度来看,基本上就像这样找到了。

回答16:

高级HTML Dom 是一个简单的HTML DOM 替换提供了相同的接口,但是它是基于DOM的,这意味着不会发生任何相关的内存问题。

它还具有完整的CSS支持,包括 jQuery 扩展。

回答17:

对于 HTML5 ,html5库已经被抛弃了多年。我可以找到的具有最新更新和维护记录的唯一HTML5库是 html5- php 一周前才发布到beta 1.0。

回答18:

我写了一个通用的XML解析器,可以轻松处理GB文件。它基于XMLReader,非常易于使用:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

这是github仓库: XmlExtractor

回答19:

我创建了一个名为"> PHPPowertools / DOM-Query 的库,这样您就可以像使用jQuery一样抓取HTML5和XML文档。

在后台,它使用 symfony / DomCrawler 进行CSS转换 XPath 选择器的选择器。即使将一个对象传递给另一个对象,它也始终使用相同的DomDocument来确保良好的性能。


示例用法:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

支持的方法:


  1. 出于明显原因将其重命名为" select"
  2. 重命名为" void",因为"空"是PHP中的保留字

注意:

该库还包括其自己的用于PSR-0兼容库的零配置自动加载器。包含的示例无需任何其他配置即可直接使用。另外,您也可以将其与作曲家一起使用。

回答20:

您可以尝试使用类似 HTML Tidy 之类的方法来清理所有"损坏的" HTML并转换HTML到XHTML,然后可以使用XML解析器进行解析。

回答21:

您可以尝试的另一种选择是 QueryPath 。它受jQuery的启发,但在PHP服务器上使用,并用于 Drupal

回答22:

XML_HTMLSax 非常稳定-即使未维护更多。另一种选择是通过 Html Tidy 通过HTML传递HTML,然后对其进行解析使用标准的XML工具。

回答23:

Symfony 框架具有可解析HTML的捆绑软件,您可以使用CSS样式选择 DOM 而不是使用 XPath

回答24:

有许多处理HTML / XML DOM的方法,其中大多数已经提到。因此,我不会尝试列出这些人。

我只想补充一点,我个人更喜欢使用DOM扩展名以及为什么:

  • iit充分利用了基础C代码的性能优势
  • 这是OO PHP(并允许我对其进行子类化处理)
  • 它的水平较低(这使我可以将其用作更高级行为的非膨胀基础)
  • 它提供对DOM各个部分的访问权限(不同于SimpleXml,它忽略了一些鲜为人知的XML功能)
  • 它具有用于DOM爬网的语法,类似于本机Javascript中使用的语法。

虽然我错过了为DOMDocument使用CSS选择器的能力,但是有一种相当简单方便的方法来添加此功能:将DOMDocument子类化并添加JS-像是子类的querySelectorAllquerySelector方法。

对于解析选择器,我建议使用非常简约的 CssSelector组件 Symfony框架。该组件只是将CSS选择器转换为XPath选择器,然后可以将其输入到DOMXpath中以检索相应的Nodelist。

然后,您可以使用此(仍然非常低级的)子类作为更多高级类的基础,例如。解析非常特定类型的XML或添加更多类似jQuery的行为。

下面的代码直接给出了我的 DOM-Query库,并使用了我描述的技术。

对于HTML解析:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

另请参见使用CSS选择器解析XML文档由Symfony的创建者Fabien Potencier决定为Symfony创建CssSelector组件以及如何使用它。

回答25:

使用 FluidXML ,您可以使用查询和迭代XML > XPath CSS选择器

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

https://github.com/servo-php/fluidxml

回答26:

JSON和XML中的数组分为三行:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Ta da!

回答27:

有几个原因不能通过正则表达式解析HTML。但是,如果您完全控制将要生成的HTML,则可以使用简单的正则表达式进行操作。

以上是通过正则表达式解析HTML的函数。请注意,此功能非常敏感,要求HTML遵守某些规则,但是在许多情况下它都可以很好地工作。如果您想要一个简单的解析器,并且不想安装库,请尝试一下:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));

回答28:

我创建了一个名为HTML5DOMDocument的库,该库可从 https://免费获得github.com/ivopetkov/html5-dom-document-php

它也支持查询选择器,我认为这对您的情况非常有帮助。这是一些示例代码:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;

回答29:

如果您熟悉jQuery选择器,则可以对PHP使用 ScarletsQuery

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

此库通常需要不到1秒的时间来处理脱机html。
它还接受无效的HTML或标记属性中缺少引号。

回答30:

解析xml的最佳方法:

$xml='http://www.example.com/rss.xml';
$rss = simplexml_load_string($xml);
$i = 0;
foreach ($rss->channel->item as $feedItem) {
  $i++;
  echo $title=$feedItem->title;
  echo '<br>';
  echo $link=$feedItem->link;
  echo '<br>';
  if($feedItem->description !='') {
    $des=$feedItem->description;
  } else {
    $des='';
  }
  echo $des;
  echo '<br>';
  if($i>5) break;
}
回到顶部