如何解析HTML/XML并从中提取信息?
当前回答
注意,这个答案推荐了那些已经废弃了10多年的图书馆。
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和.class或DIV标记选择器。但您也可以使用XPath语句,这有时会更快。另外,典型的jQuery方法,如->children()和->text(),特别是->attr(),简化了提取正确的HTML片段。(并且已经解码了它们的SGML实体。)
$qp->xpath("//div/p[1]"); // get first paragraph in a div
QueryPath还允许将新标记注入流(->追加),然后输出并美化更新的文档(->写入HTML)。它不仅可以解析格式错误的HTML,还可以解析各种XML方言(带有名称空间),甚至可以从HTML微格式(XFN、vCard)中提取数据。
$qp->find("a[target=_blank]")->toggleClass("usability-blunder");
.
phpQuery还是QueryPath?
一般来说,QueryPath更适合处理文档。而phpQuery还实现了一些伪AJAX方法(仅HTTP请求),以更接近于jQuery。据称,phpQuery通常比QueryPath更快(因为总体特性较少)。
有关差异的更多信息,请参阅tagbyte.org上的wayback机器上的比较
优势
简单可靠易于使用的替代方案->查找(“a img,a object,div a”)正确的数据取消捕获(与正则表达式grepping相比)
其他回答
解析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;
}
不使用正则表达式解析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/")));
有很多方法:
一般来说:
本机XML扩展:它们与PHP捆绑在一起,通常比所有第三方库都快,并为我提供了对标记所需的所有控制。DOM:DOM能够解析和修改真实世界(损坏的)HTML,并且可以执行XPath查询。它基于libxml。XMLReader:XMLReader与DOM一样,基于libxml。XMLReader扩展是一个XML拉式解析器。读取器充当文档流上前进的光标,并在途中的每个节点处停止XML解析器:此扩展允许您创建XML解析器,然后为不同的XML事件定义处理程序。每个XML解析器也有一些可以调整的参数。它实现了SAX风格的XML推送解析器。简单XML:SimpleXML扩展提供了一个非常简单且易于使用的工具集,用于将XML转换为可以使用普通属性选择器和数组迭代器处理的对象。
第三方库[libxml-based]:
FluentDom-Repo:FluentDom为PHP中的DOMDocument提供了一个类似jQuery的fluent XML接口。它可以加载JSON、CSV、JsonML、RabbitFish等格式。可以通过Composer安装。HtmlPageDom:是一个PHP库,使用它可以方便地操纵HTML文档。它需要Symfony2组件的DomCrawler来遍历DOM树,并通过添加操纵HTML文档的DOM树的方法来扩展它。ZendDOM:Zend_Dom提供了处理Dom文档和结构的工具。目前,他们提供了Zend_Dom_Query,它为使用XPath和CSS选择器查询Dom文档提供了统一的接口。QueryPath:QueryPath是一个用于处理XML和HTML的PHP库。它不仅设计用于本地文件,还设计用于web服务和数据库资源。它实现了大部分jQuery接口(包括CSS样式选择器),但它针对服务器端使用进行了大量调整。可以通过Composer安装。fDOM文档:fDOMDocument扩展了标准DOM,以在所有错误情况下使用异常,而不是PHP警告或通知。为了方便和简化DOM的使用,他们还添加了各种自定义方法和快捷方式。Sabre/XML:ssabre/XML是一个库,它包装并扩展XMLReader和XMLWriter类,以创建一个简单的“XML到对象/数组”映射系统和设计模式。编写和读取XML是一次性的,因此速度很快,对大型XML文件的内存要求很低。FluidXML:FluidXML是一个PHP库,用于使用简洁流畅的API处理XML。它利用XPath和流畅的编程模式,使其变得有趣和有效。
第三方库[不基于libxml]:
PHP简单HTML DOM解析器:一个用PHP5+编写的HTML DOM解析器允许您以非常简单的方式操作HTML,它需要PHP 5+。还支持无效的HTML。它在单行中从HTML中提取内容。代码库很糟糕,而且工作速度很慢。PHPHtmlParser:HPHtmlParser是一个简单、灵活的Html解析器,允许您使用任何CSS选择器(如jQuery)选择标记。目标是帮助开发需要快速、简单的方式来抓取HTML的工具,无论它是否有效。它速度慢,占用了太多CPU电源。Ganon(推荐):通用标记器和HTML/XML/RSS DOM解析器。它具有操纵元素及其属性的能力。它支持无效的HTML和UTF8。它可以对元素执行类似CSS3的高级查询(如jQuery——支持名称空间)。HTML美化器(如HTML Tidy)。精简CSS和Javascript。它对属性进行排序、更改字符大小写、正确缩进等。可扩展。操作分为较小的功能,便于覆盖和快速且易于使用。
Web服务:
如果您不想编写PHP,也可以使用Web服务。ScraperWiki的外部界面允许您以您希望在web或自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮刀状态的信息。
我已经分享了所有的资源,你可以根据自己的口味、用途等进行选择。
顺便说一下,这通常被称为屏幕刮擦。我为此使用的库是SimpleHTMLDomParser。
Advanced Html Dom是一个简单的Html Dom替代品,它提供了相同的界面,但它是基于Dom的,这意味着不会出现任何相关的内存问题。
它还具有完整的CSS支持,包括jQuery扩展。
推荐文章
- 样式化HTML电子邮件的最佳实践
- CSS/HTML:什么是使文本斜体的正确方法?
- 我如何才能在表中应用边界?
- 如何使一个DIV不包装?
- CSS div元素-如何显示水平滚动条只?
- 阻止人们入侵基于php的Flash游戏高分表的最佳方法是什么
- 将Dropzone.js与其他字段集成到现有的HTML表单中
- 使用“!”的含义是什么?重要的”?
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- 格式化XML字符串以打印友好的XML字符串
- __construct函数的作用是什么?
- PHP中的异步shell执行器
- Laravel 5 -如何访问在视图存储上传的图像?
- 资源解释为样式表,但以MIME类型text/html传输(似乎与web服务器无关)
- 复选框输入是否只在被选中时才发布数据?