如何在php中解析和处理html/xml?

5t7ly7z5  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(389)

如何解析html/xml并从中提取信息?

k4emjkb1

k4emjkb11#

本机xml扩展

我更喜欢使用原生xml扩展,因为它们与php捆绑在一起,通常比所有第三方lib都要快,并提供了对标记所需的所有控制。

多姆

dom扩展允许您使用php5通过domapi对xml文档进行操作。它是w3c文档对象模型核心级别3的实现,是一个平台和语言中立的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。
dom能够解析和修改真实世界的html,并且可以执行xpath查询。它基于libxml。
使用dom需要一些时间,但在我看来,这是非常值得的。因为dom是一个与语言无关的接口,您可以在许多语言中找到实现,因此如果您需要更改编程语言,那么您可能已经知道如何使用该语言的dom api了。
在获取a元素的href属性中可以找到一个基本的用法示例,在php的domdocument中可以找到一个一般的概念概述
如何使用dom扩展已经在stackoverflow上做了大量的介绍,因此如果您选择使用它,您可以确定您遇到的大多数问题都可以通过搜索/浏览stack overflow来解决。

XML阅读器

xmlreader扩展是一个xml拉解析器。读卡器充当在文档流上前进的光标,并在途中的每个节点处停止。
与dom一样,xmlreader也是基于libxml的。我不知道如何触发html解析器模块,因此使用xmlreader解析损坏的html可能不如使用dom(在dom中可以显式地告诉它使用libxml的html解析器模块)那么健壮。
一个基本的用法示例可以在使用php从h1标记获取所有值时找到

xml解析器

此扩展允许您创建xml解析器,然后为不同的xml事件定义处理程序。每个xml解析器也有一些可以调整的参数。
xml解析器库也基于libxml,实现了sax风格的xml推式解析器。对于内存管理来说,它可能比dom或simplexml更好,但比xmlreader实现的pull解析器更难使用。

简单XML

simplexml扩展提供了一个非常简单且易于使用的工具集,用于将xml转换为可以使用普通属性选择器和数组迭代器处理的对象。
当您知道html是有效的xhtml时,simplexml是一个选项。如果您需要解析损坏的html,甚至不要考虑simplexml,因为它会阻塞。
在一个简单的程序中可以找到一个基本的用法示例来crud xml文件的node和node值,php手册中还有很多其他示例。

第三方库(基于libxml)

如果您喜欢使用第三方lib,我建议使用一个实际上在下面使用dom/libxml的lib,而不是字符串解析。

fluentdom-回购

fluentdom为php中的domdocument提供了类似jquery的fluentxml接口。选择器是用xpath或css编写的(使用css-to-xpath转换器)。当前版本扩展了dom实现的标准接口,并添加了dom生活标准的特性。fluentdom可以加载json、csv、jsonml、rabbitfish等格式。可通过composer安装。

HTML页面

wa72\htmlpagedom`是一个php库,用于轻松操纵html文档,它需要symfony2组件中的domcrawler来遍历dom树,并通过添加操纵html文档的dom树的方法对其进行扩展。

phpquery(多年未更新)

phpquery是一个服务器端、可链接、css3选择器驱动的文档对象模型(dom)api,基于php5编写的jqueryjavascript库,并提供额外的命令行接口(cli)。
另请参见:https://github.com/electrolinux/phpquery

泽德杜姆

zenddom提供了处理dom文档和结构的工具。目前,我们提供了zend\udomquery,它为使用xpath和css选择器查询dom文档提供了一个统一的接口。

查询路径

querypath是一个用于处理xml和html的php库。它不仅设计用于处理本地文件,还可以处理web服务和数据库资源。它实现了jquery接口的大部分功能(包括css样式选择器),但是它为服务器端的使用做了大量的调整。可通过composer安装。

FDOM文档

fdomdocument扩展了标准dom,使其在所有错误情况下都使用异常,而不是php警告或通知。为了方便和简化dom的使用,它们还添加了各种自定义方法和快捷方式。

sabre/xml文件

sabre/xml是一个库,它 Package 和扩展xmlreader和xmlwriter类,以创建一个简单的“xml到对象/数组”Map系统和设计模式。编写和读取xml是单通道的,因此速度很快,并且在大型xml文件上需要较低的内存。

fluidxml

fluidxml是一个php库,用于使用简洁流畅的api操作xml。它利用了xpath和fluent编程模式,使之有趣而有效。

第三方(不基于libxml)

基于dom/libxml构建的好处是,您可以获得开箱即用的良好性能,因为您是基于本机扩展的。然而,并不是所有的第三方lib都走这条路。其中一些列在下面

php简单html dom解析器

用php5+编写的htmldom解析器可以让您以一种非常简单的方式操作html!
需要php 5+。
支持无效的html。
像jquery一样使用选择器在html页面上查找标记。
在一行中从html中提取内容。
我一般不建议使用这种解析器。代码库是可怕的,解析器本身是相当缓慢和内存饥饿。并非所有jquery选择器(如子选择器)都是可能的。任何一个基于libxml的库都应该很容易地超越这一点。

php html解析器

phtmlparser是一个简单、灵活的html解析器,它允许您使用任何css选择器(如jquery)选择标记。我们的目标是协助开发工具,这些工具需要一种快速、简单的方法来废弃html,不管它是否有效!这个项目最初是由sunra/php简单的htmldom解析器支持的,但是支持似乎已经停止了,所以这个项目是我对他以前工作的改编。
同样,我不建议使用这种解析器。这是相当缓慢的高cpu使用率。也没有清除已创建dom对象内存的函数。这些问题特别适用于嵌套循环。文档本身是不准确和拼写错误的,自4月14日至16日没有任何修复响应。

加农

通用标记器和html/xml/rssdom解析器
操纵元素及其属性的能力
支持无效的html和utf8
可以对元素执行类似css3的高级查询(如jquery—支持名称空间)
html美化器(如html tidy)
缩小css和javascript
排序属性、更改字符大小写、更正缩进等。
可扩展的
使用基于当前字符/标记的回调解析文档
在较小的函数中分离操作以便于重写
快速简便
从没用过。看不出来有没有好处。

html 5

您可以使用上面的方法来解析html5,但是由于html5允许的标记,可能会有一些奇怪的地方。因此,对于html5,您需要考虑使用一个专用的解析器,比如
HTML5库
一个基于whatwg html5规范的html解析器的python和php实现,最大限度地兼容主要的桌面web浏览器。
一旦html5完成,我们可能会看到更多专用的解析器。w3的一篇名为how-to for HTML5 parsing的博客文章也值得一看。

Web服务

如果您不想编写php,也可以使用web服务。总的来说,我发现这些工具的实用性很小,但这只是我和我的用例。

斯克拉维基。

scraperwiki的外部接口允许您以希望在web或您自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮板状态的信息。

正则表达式

最后,也是最不推荐的,您可以使用正则表达式从html中提取数据。一般来说,不鼓励在html上使用正则表达式。
在web上找到的大多数与标记匹配的代码片段都很脆弱。在大多数情况下,它们只适用于一段非常特殊的html。微小的标记更改,比如在某个地方添加空格,或者在标记中添加或更改属性,都会使regex在编写不正确时失败。在html上使用regex之前,您应该知道自己在做什么。
html解析器已经知道html的语法规则。正则表达式必须针对您编写的每个新正则表达式进行教学。正则表达式在某些情况下是好的,但它实际上取决于您的用例。
您可以编写更可靠的解析器,但是当前面提到的库已经存在并且在这方面做得更好时,用正则表达式编写一个完整可靠的自定义解析器是浪费时间的。
另请参见用cthulhu方法解析html

书籍

如果你想花钱,看看
php架构师指南
我不是php架构师或作者的下属。

nafvub8i

nafvub8i2#

只需使用domdocument->loadhtml()就可以了。libxml的html解析算法非常好而且很快,而且与流行的观点相反,它不会阻塞格式错误的html。

ztigrdn8

ztigrdn83#

尝试简单的html dom解析器
用php编写的html-dom解析器 5+让你以一种非常简单的方式操作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;

刮削斜杠:

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

相关问题