如何解析HTML/XML并从中提取信息?
当前回答
我在这里没有提到的一种通用方法是通过Tidy运行HTML,它可以设置为输出保证有效的XHTML。然后可以在上面使用任何旧的XML库。
但对于您的具体问题,您应该看看这个项目:http://fivefilters.org/content-only/--这是Readability算法的一个修改版本,它旨在从页面中提取文本内容(而不是页眉和页脚)。
其他回答
解析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/XTML结构,如果通过大多数解析器加载,则会失败。
尝试简单HTML DOM解析器。
一个用PHP5+编写的HTMLDOM解析器,可以让您以非常简单的方式操作HTML!需要PHP 5+。支持无效的HTML。使用类似jQuery的选择器在HTML页面上查找标记。从HTML中提取单行内容。下载
注意:顾名思义,它可以用于简单的任务。它使用正则表达式而不是HTML解析器,因此对于更复杂的任务,速度会慢得多。它的大部分代码库是在2008年编写的,此后只做了一些小的改进。它不遵循现代PHP编码标准,将其纳入符合PSR的现代项目将是一个挑战。
示例:
如何获取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);
有很多方法:
一般来说:
本机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或自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮刀状态的信息。
我已经分享了所有的资源,你可以根据自己的口味、用途等进行选择。
对于1a和2:我将投票支持新的Symfony Componet类DOMCrawler(DOMCrawler)。此类允许类似于CSS选择器的查询。看看这个演示文稿,看看真实世界的例子:news-of-the-symfony2-world。
该组件设计为独立工作,可以在没有Symfony的情况下使用。
唯一的缺点是它只适用于PHP5.3或更高版本。
推荐文章
- 如何删除和清除所有的本地存储数据
- Json_encode()转义正斜杠
- 如何在PHP中捕获cURL错误
- 强制打开“另存为…”弹出打开文本链接点击PDF在HTML
- 如何修改标签文本?
- 如何在XSLT中实现if-else语句?
- 如何要求一个分叉与作曲家?
- 在HTML中还有其他有用的空格码吗,比如半空格的 , em-spaces, en-spaces等等?
- 输入触发器按钮单击
- 如何在php中创建可选参数?
- Angular 2模板中的标签是什么意思?
- 在文本文件中创建或写入/追加
- 如何设置身体高度溢出滚动
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 在输入type="number"时禁用webkit的旋转按钮?