如何在PHP中解析和处理超文本标记语言/XML?

如何解析超文本标记语言/XML并从中提取信息?

464324 次浏览

#0相当稳定——即使不再维护它。另一种选择是通过处理相关文档Html Tidy管道传输超文本标记语言,然后使用标准XML工具解析它。

简单的超文本标记语言DOM是一个很棒的开源解析器:

simplehtmldom.sourceforge

它以面向对象的方式处理DOM元素,新的迭代对不兼容的代码有很多覆盖。还有一些很棒的函数,就像你在JavaScript中看到的那样,比如“查找”函数,它将返回该标签名称的元素的所有实例。

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

您可以尝试使用超文本标记语言Tidy之类的东西来清理任何“损坏的”超文本标记语言并将超文本标记语言转换为XHTML,然后您可以使用XML解析器进行解析。

只要使用DOM Document->load HTML()就可以了。libxml的超文本标记语言解析算法非常好和快速,而且与流行的看法相反,不会窒息于格式错误的超文本标记语言。

试试简单的超文本标记语言DOM解析器

  • 用PHP 5+编写的超文本标记语言DOM解析器,可让您以非常简单的方式操作超文本标记语言!
  • 需要PHP 5+。
  • 支持无效的超文本标记语言。
  • 在带有选择器的超文本标记语言页面上查找标签,就像jQuery一样。
  • 在单行中从超文本标记语言中提取内容。
  • 下载

注意:顾名思义,它可用于简单的任务。它使用正则表达式而不是超文本标记语言解析器,因此对于更复杂的任务来说速度会慢得多。它的大部分代码库是在2008年编写的,此后仅进行了小幅改进。它不遵循现代PHP编码标准,并且将其整合到符合现代PSR的项目中具有挑战性。

例子:

如何获取超文本标记语言元素:

// Create DOM from URL or file$html = file_get_html('http://www.example.com/');
// Find all imagesforeach($html->find('img') as $element)echo $element->src . '<br>';
// Find all linksforeach($html->find('a') as $element)echo $element->href . '<br>';

如何修改超文本标记语言元素:

// 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;

从超文本标记语言中提取内容:

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

刮斜线:

// Create DOM from URL$html = file_get_html('http://slashdot.org/');
// Find all article blocksforeach($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);

原生XML扩展

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

DOM

DOM扩展允许您使用PHP 5通过DOM API对XML文档进行操作。它是W3C的Document Object Model Core Level 3的实现,这是一个平台和语言中立的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。

DOM能够解析和修改现实世界(破碎的)超文本标记语言,它可以做XPath查询。它基于libxml

使用DOM需要一些时间来提高效率,但在我看来,这段时间是值得的。由于DOM是一个与语言无关的接口,您会发现许多语言的实现,所以如果您需要更改您的编程语言,那么您很可能已经知道如何使用该语言的DOM API。

如何使用DOM扩展在StackOverflow上一直是广泛覆盖,所以如果你选择使用它,你可以确保你遇到的大多数问题都可以通过搜索/浏览Stack Overflow来解决。

A基本用法示例和A一般概念概述在其他答案中可用。

XMLReader

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

我不知道如何触发超文本标记语言解析器模块,所以使用XMLReader解析破碎的超文本标记语言可能不如使用DOM健壮,在DOM中您可以明确地告诉它使用libxml的超文本标记语言解析器模块。

基本用法示例在另一个答案中可用。

XML解析器

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

XML解析器库也基于libxml,并实现了SAX样式的XML推送解析器。对于内存管理来说,它可能是比DOM或SimpleXML更好的选择,但比XMLReader实现的拉式解析器更难使用。

SimpleXml

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

当您知道超文本标记语言是有效的XHTML时,SimpleXML是一个选择。如果您需要解析损坏的超文本标记语言,甚至不要考虑SimpleXml,因为它会窒息。

A基本用法示例可用,有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库,用于轻松操作超文本标记语言使用DOM的文档。它需要来自Symfony2的DomCrawler组件遍历DOM树,并通过添加操作DOM树的方法来扩展它超文本标记语言文档的DOM树。

phpQuery

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

这被描述为“放弃软件和错误:自担风险使用”,但似乎得到了最低限度的维护。

laminas-dom

Laminas\Dom组件(以前Zend_DOM)提供了处理DOM文档和结构的工具。目前,我们提供Laminas\Dom\Query,它提供了一个统一的接口,用于使用XPath和CSS选择器查询DOM文档。

此包被认为是功能完整的,现在处于仅安全维护模式。

fDOMDocument

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

Sabre/xml

Sabre/xml是一个库,它包装和扩展了XMLReader和XMLWriter类,以创建一个简单的“xml到对象/数组”映射系统和设计模式。写入和读取XML是单程的,因此速度很快,并且对大型xml文件的内存要求很低。

FluidXML

FluidXML是一个PHP库,用于使用简洁流畅的API操作XML。它利用XPath和流畅的编程模式变得有趣和有效。


第三方(不是基于libxml的)

基于DOM/libxml构建的好处是您可以获得开箱即用的良好性能,因为您是基于本机扩展的。然而,并非所有的第三方库都走这条路

PHP简单的超文本标记语言DOM解析器

  • 用PHP5+编写的超文本标记语言DOM解析器可让您以非常简单的方式操作超文本标记语言!
  • 需要PHP 5+。
  • 支持无效的超文本标记语言。
  • 在带有选择器的超文本标记语言页面上查找标签,就像jQuery一样。
  • 在单行中从超文本标记语言中提取内容。

我一般不推荐这个解析器。代码库很糟糕,解析器本身很慢,内存消耗很大。并非所有的jQuery选择器(例如子选择器)都是可能的。任何基于libxml的库都应该很容易超越这一点。

PHP Html解析器

PHPHtmlParser是一个简单、灵活的html解析器,它允许您使用任何css选择器(如jQuery)选择标签。目标是协助开发需要快速、简单方法来抓取html的工具,无论它是否有效!这个项目最初是由sunra/php-simple-html-dom-parser支持的,但支持似乎已经停止,所以这个项目是我对他以前工作的改编。

同样,我不推荐这个解析器。它相当慢,CPU使用率高。也没有清除创建的DOM对象内存的功能。这些问题特别适用于嵌套循环。留档本身不准确且拼写错误,自4月14日至16日没有对修复的响应。


超文本标记语言5

您可以使用上面的代码来解析HTML5,但是由于HTML5允许的标记,所以可能会有怪癖。因此,对于HTML5,您可能需要考虑使用专用解析器。请注意,这些是用PHP编写的,因此与低级语言的编译扩展相比,性能较慢,内存使用量增加。

HTML5DomDocument

HTML5DOMDocument扩展了原生DOMDocument库。它修复了一些错误并添加了一些新功能。

  • 保留html实体(DOMDocument不)
  • 保留无效标签(DOMDocument不)
  • 允许插入超文本标记语言代码,将正确的部分移动到正确的位置(head元素插入头部,body元素插入主体)
  • 允许使用CSS选择器(当前可用:*tagnametagname#id#idtagname.classname.classnametagname.classname.classname2.classname.classname2tagname[attribute-selector][attribute-selector]tagname0、tagname1、tagname2、tagname3和tagname4)查询DOM。
  • 添加对element->class List的支持。
  • 添加对element->innerHTML的支持。
  • 添加对element->outerHTML的支持。

HTML5

HTML5是一个完全用PHP编写的符合标准的HTML5解析器和编写器。它很稳定,用于许多生产网站,下载量超过500万次。

HTML5提供以下功能。

  • 一个HTML5序列化程序
  • 支持PHP命名空间
  • Composer支持
  • 基于事件(类似SAX)的解析器
  • 一个DOM树生成器
  • 与QueryPath的互操作性
  • 在PHP 5.3.0或更高版本上运行

正则表达式

最后和最不推荐,您可以使用正则表达式从超文本标记语言中提取数据。通常不鼓励在超文本标记语言上使用正则表达式。

您在网络上找到的大多数匹配标记的片段都很脆弱。在大多数情况下,它们仅适用于非常特定的超文本标记语言。微小的标记更改,例如在某处添加空格,或在标记中添加或更改属性,可能会使RegEx在未正确编写时失败。在超文本标记语言上使用RegEx之前,您应该知道自己在做什么。

超文本标记语言解析器已经知道超文本标记语言的语法规则。必须为您编写的每个新RegEx教授正则表达式。RegEx在某些情况下很好,但它确实取决于您的用例。

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

另见解析Html The Cthulhu Way


书籍

如果你想花点钱,看看

我不隶属于PHP Architect或作者。

顺便说一下,这通常被称为屏幕抓取。我为此使用的库是超文本标记语言Dom Parser

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

该组件设计为独立工作,可以在没有Symfony的情况下使用。

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

为什么你不应该和当你应该使用正则表达式?

首先,一个常见的误称:Regexps不适用于"解析中"超文本标记语言。然而,Regex可以"提取"数据。提取是它们的目的。在适当的SGML工具包或基线XML解析器上,regex超文本标记语言提取的主要缺点是它们的语法工作和不同的可靠性。

考虑制作一个有点可靠的超文本标记语言提取正则表达式:

<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遍历前端不显示超文本标记语言注释<!--,但有时它们是更有用的提取锚点。特别是伪超文本标记语言变体<$var>或SGML残基很容易被正则表达式驯服。
  • 通常正则表达式可以节省后处理。然而,超文本标记语言实体通常需要手动处理。
  • 最后,对于像提取非常简单的任务,它们实际上是一种可能的工具。与SGML/XML解析器相比,速度优势大多只是在这些非常基本的提取过程中发挥作用。

有时甚至建议使用正则表达式/<!--CONTENT-->(.+?)<!--END-->/预提取超文本标记语言片段,并使用更简单的超文本标记语言解析器前端处理其余部分。

备注:我实际上有这个应用程序,在那里我交替使用XML解析和正则表达式。就在上周,PyQuery解析坏了,正则表达式仍然有效。是的,很奇怪,我自己也无法解释。但它发生了。
所以请不要投票现实世界的考虑,只是因为它不符合regex=邪恶的模因。

使用DOM而不是字符串解析的SimpleHtmlDom的第三方替代品:phpQueryZend_Dom查询路径查询路径FluentDom

请注意,此答案推荐了现已废弃10多年的库。

phpQuery查询路径查询路径在复制流畅的jQuery API方面非常相似。这也是为什么它们是PHP中适当解析超文本标记语言的两种最简单的方法。

QueryPath示例

基本上,您首先从超文本标记语言字符串创建可查询的DOM树:

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

生成的对象包含超文本标记语言文档的完整树表示。可以使用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(),简化了提取正确的超文本标记语言片段。(并且已经解码了它们的SGML实体。)

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

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

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

.

phpQuery还是QueryPath?

一般来说,QueryPath更适合处理文档。虽然phpQuery也实现了一些伪AJAX方法(只是HTTP请求),以更接近jQuery。据说phpQuery通常比QueryPath更快(因为整体功能较少)。

有关差异的更多信息,请参阅这是tagbyte.org的Wayback机器上的比较。(原始来源丢失,所以这里有一个互联网存档链接。是的,你仍然可以找到丢失的页面,伙计们。)

优势

  • 简单性和可靠性
  • 简单易用的替代品->find("a img, a object, div a")
  • 正确的数据转义(与正则表达式greping相比)

这听起来像是W3CXPath技术的一个很好的任务描述。很容易表达像“返回嵌套在<foo><bar><baz> elements中的img标签中的所有href属性”这样的查询。不是PHP爱好者,我不能告诉你XPath可能以什么形式可用。如果您可以调用外部程序来处理超文本标记语言文件,您应该能够使用XPath的命令行版本。有关快速介绍,请参阅http://en.wikipedia.org/wiki/XPath

我还没有看到这里提到的一种通用方法是通过整洁运行超文本标记语言,它可以设置为输出保证有效的XHTML。然后您可以在上面使用任何旧的XML库。

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

您可以尝试的另一个选项是查询路径查询路径。它受到jQuery的启发,但在PHP中的服务器上并在Drupal中使用。

我们之前已经为我们的需求创建了相当多的爬虫。在一天结束的时候,通常是简单的正则表达式做得最好。虽然上面列出的库因其创建的原因而很好,但如果你知道你在寻找什么,正则表达式是一种更安全的方式,因为你也可以处理无效的超文本标记语言/XHTML结构,如果通过大多数解析器加载,这些结构会失败。

Symfony框架具有可以解析超文本标记语言的包,您可以使用CSS样式选择DOM而不是使用XPath

是的,你可以使用simple_html_dom。然而,我在simple_html_dom上做了很多工作,特别是在网页抓取方面,发现它太脆弱了。它做了基本的工作,但无论如何我都不会推荐它。

我从来没有用过卷曲的目的,但我学到的是,卷曲可以更有效地完成这项工作,更坚实。

请查看此链接:抓取-网站-与-卷曲

查询路径查询路径很好,但要小心“跟踪状态”,因为如果你没有意识到它的含义,这可能意味着你浪费了大量的调试时间试图找出发生了什么以及为什么代码不起作用。

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

为了获得类似jQuery的行为,您需要在执行过滤/修改类似操作之前进行分支,这意味着它将更密切地反映jQuery中发生的事情。

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

$results现在包含input[name='forename']的结果集,而不是原始查询"div p",这让我很困惑,我发现查询路径查询路径跟踪过滤器和查找以及修改结果并将其存储在对象中的所有内容

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

那么$results就不会被修改,你可以一次又一次地重用结果集,也许有更多知识的人可以稍微澄清一下,但我发现的基本上是这样的。

我推荐PHP简单超文本标记语言DOM解析器

它真的有很好的功能,比如:

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

我写了一个通用的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 repo:XmlExtractor

对于HTML5,html5 lib已经被放弃多年了。我能找到的唯一有最近更新和维护记录的HTML5库是html5-php,它在一周多前刚刚进入beta 1.0。

JSON和XML数组在三行中:

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

Ta da!

有几个理由不使用正则表达式解析超文本标记语言。但是,如果您可以完全控制将生成什么超文本标记语言,那么您可以使用简单的正则表达式。

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

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/")));

处理超文本标记语言/XML DOM的方法有很多,其中大多数已经提到过。因此,我不会试图自己列出这些。

我只是想补充一点,我个人更喜欢使用DOM扩展以及原因:

  • iit充分利用了底层C代码的性能优势
  • 它是OO PHP(并允许我对其进行子类化)
  • 它的级别相当低(这允许我将其用作更高级行为的非膨胀基础)
  • 它提供对DOM的每个部分的访问(不像SimpleXml,它忽略了一些鲜为人知的XML特性)
  • 它有一个用于DOM抓取的语法,类似于原生Javascript中使用的语法。

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

为了解析选择器,我建议使用Symfony框架中非常简约的cssselector组件。该组件仅将CSS选择器转换为XPath选择器,然后将其输入DOMXpath以检索相应的节点列表。

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

下面的代码直接来自我的DOM-Query库并使用我描述的技术。

超文本标记语言解析:

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);}}}}
[...]}

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

高级Html Dom是一个简单的超文本标记语言DOM替代品,提供相同的接口,但它是基于DOM的,这意味着不会发生任何相关的内存问题。

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

我创建了一个名为PHP电动工具/DOM-查询的库,它允许您像使用jQuery一样抓取HTML5和XML文档。

在底层,它使用sym f ony/Dom Crawl er将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. 重命名为“选择”,原因显而易见
  2. 重命名为'ull',因为'空'是PHP中的保留字

注:

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

使用流体XML,您可以使用XPathCSS选择器查询和迭代XML。

$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

我创建了一个名为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;

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

<pre><?phpinclude "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 tagprint_r($description->attr('content'));
$description = $dom->selector('#Content p');
// Get element arrayprint_r($description->view);

这个库通常需要不到1秒的时间来处理脱机html。
它还接受无效的超文本标记语言或缺少标记属性的引号。

解析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;}

有很多方法:

一般而言:

  • FluentDOM为PHP中的DOMDocument提供了一个类似jQuery的流畅XML接口。它可以加载JSON、CSV、JsonML、RabbitFish等格式。可以通过Composer安装。

  • HtmlPageDom:是一个PHP库,用于轻松操作超文本标记语言文档,它需要Symfony2组件的DomCrawler来遍历DOM树,并通过添加操作超文本标记语言文档的DOM树的方法来扩展它。

  • ZendDOM:Zend_Dom提供了处理DOM文档和结构的工具。目前,它们提供Zend_Dom_Query,为使用XPath和CSS选择器查询DOM文档提供了统一的接口。

  • 查询路径: QueryPath是一个用于操作XML和超文本标记语言的PHP库。它不仅用于处理本地文件,还用于处理Web服务和数据库资源。它实现了大部分jQuery接口(包括CSS样式的选择器),但它经过了大量调整以供服务器端使用。可以通过Composer安装。

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

  • Sabre/XML: Sabre/xml是一个库,它包装和扩展了XMLReader和XMLWriter类,以创建一个简单的“xml到对象/数组”映射系统和设计模式。写入和读取XML是单程的,因此速度很快,并且对大型xml文件的内存要求很低。

  • FluidXML: FluidXML是一个PHP库,用于使用简洁流畅的API操作XML。它利用XPath和流畅的编程模式变得有趣和有效。

第三方库[不是基于libxml的]:

  • PHP简单的超文本标记语言DOM解析器:用PHP5+编写的超文本标记语言DOM解析器可让您以非常简单的方式操作超文本标记语言,它需要PHP 5+。还支持无效的超文本标记语言。它在一行中从超文本标记语言中提取内容。代码库很糟糕,工作速度很慢。

  • PHP Html解析器: HPHtmlParser是一个简单、灵活的超文本标记语言解析器,它允许您使用任何CSS选择器(如jQuery)选择标记。目标是协助开发需要快速、简单方法来抓取超文本标记语言的工具,无论它是否有效。它很慢,占用太多CPU功率。

  • 加农(推荐):通用标记器和超文本标记语言/XML/RSS DOM解析器。它具有操作元素及其属性的能力。它支持无效的超文本标记语言和UTF8。它可以对元素执行高级的类似CSS3的查询(如jQuery-支持的命名空间)。超文本标记语言美化器(如超文本标记语言Tidy)。缩小CSS和Javascript。它对属性进行排序,更改字符大小写,纠正缩进等。可扩展。操作分为更小的功能,便于覆盖和快速和易于使用。

网络服务:

  • 如果您不喜欢编程PHP,您也可以使用Web服务。SCraperWiki的外部界面允许您以所需的形式提取数据,以便在Web或您自己的应用程序中使用。您还可以提取有关任何刮刀状态的信息。

我已经分享了所有的资源,你可以根据自己的口味,有用性等进行选择。