- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何解析HTML / XML并从中提取信息?
最佳答案
本机XML扩展
我更喜欢使用native XML extensions之一,因为它们与PHP捆绑在一起,通常比所有第三方库都快,并为我提供了所需的所有标记控制权。
DOM
DOM扩展使您可以使用PHP 5通过DOM API通过XML文档进行操作。它是W3C的Document Object Model Core Level 3的实现,它是一种平台和语言无关的界面,允许程序和脚本动态访问和更新。文件的内容,结构和样式。
DOM能够解析和修改现实世界(损坏的)HTML,并且可以执行XPath queries。它基于libxml。
使用DOM需要花一些时间,但是IMO值得花时间。由于DOM是与语言无关的接口,因此您会发现许多语言的实现,因此,如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的DOM API。
可以在Grabbing the href attribute of an A element中找到基本的用法示例,而在DOMDocument in php中可以找到常规的概念概述。
How to use the DOM extension has been covered extensively on StackOverflow,因此,如果您选择使用它,可以确保可以通过搜索/浏览堆栈溢出来解决所遇到的大多数问题。
XMLReader
XMLReader扩展是XML提取解析器。阅读器充当光标,在文档流上前进,并在途中的每个节点处停止。
与DOM一样,XMLReader也基于libxml。我不知道如何触发HTML解析器模块,因此使用XMLReader解析损坏的HTML的机会可能不如使用DOM健壮,因为在DOM中您可以明确地告诉它使用libxml的HTML解析器模块。
基本用法示例可在getting all values from h1 tags using php中找到
XML Parser
此扩展使您可以创建XML解析器,然后为不同的XML事件定义处理程序。每个XML解析器还具有一些您可以调整的参数。
XML解析器库也基于libxml,并实现了SAX样式的XML推送解析器。与DOM或SimpleXML相比,内存管理可能是更好的选择,但与XMLReader实现的请求解析器相比,使用起来更加困难。
SimpleXml
SimpleXML扩展提供了一个非常简单易用的工具集,可以将XML转换为可以使用常规属性选择器和数组迭代器处理的对象。
当您知道HTML是有效的XHTML时,可以选择SimpleXML。如果您需要解析损坏的HTML,甚至不用考虑SimpleXml,因为它会阻塞。
可以在A simple program to CRUD node and node values of xml file找到一个基本的用法示例,其中有lots of additional examples in the PHP Manual。
第三方库(基于libxml)
如果您更喜欢使用第三方库,则建议使用实际上在下面使用DOM / libxml而不是字符串解析的库。
FluentDom-Repo
FluentDOM为PHP中的DOMDocument提供了类似jQuery的Fluent XML接口。选择器以XPath或CSS编写(使用CSS到XPath转换器)。当前版本扩展了DOM的实现标准接口,并增加了DOM Living Standard的功能。 FluentDOM可以加载JSON,CSV,JsonML,RabbitFish等格式。可以通过Composer安装。
HtmlPageDom
Wa72 \ HtmlPageDom`是一个PHP库,可轻松操作HTML
使用It的文档需要DomCrawler from Symfony2 components才能遍历
DOM树并通过添加操作DOM的方法对其进行扩展
HTML文档树。
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 Simple HTML DOM Parser
用PHP5 +编写的HTML DOM解析器使您能够以非常简单的方式操作HTML!
需要PHP 5+。
支持无效的HTML。
使用jQuery之类的选择器在HTML页面上查找标签。
从HTML中提取内容。
我通常不建议使用此解析器。代码库太可怕了,解析器本身也很慢并且占用大量内存。并非所有的jQuery选择器(例如child selectors)都是可能的。任何基于libxml的库都应该容易地胜过它。
PHP Html Parser
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允许使用there can be quirks。因此,对于HTML5,您需要考虑使用专用的解析器,例如
html5lib
基于WHATWG HTML5规范的HTML解析器的Python和PHP实现,以实现与主要桌面Web浏览器的最大兼容性。
HTML5完成后,我们可能会看到更多专用的解析器。 W3上还有一个名为How-To for html 5 parsing的博客,值得一看。
网页服务
如果您不想编程PHP,也可以使用Web服务。通常,我发现这些工具的实用性很小,但这只是我和我的用例。
ScraperWiki。
ScraperWiki的外部界面允许您以想要在Web或您自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮板状态的信息。
常用表达
最后建议,您可以使用regular expressions从HTML提取数据。通常,不建议在HTML上使用正则表达式。
您可以在网络上找到与标记匹配的大多数代码片段。在大多数情况下,它们仅适用于非常特殊的HTML。微小的标记更改(例如在某处添加空格,在标签中添加或更改标签中的属性)会使RegEx在书写不正确时失败。在HTML上使用RegEx之前,您应该知道自己在做什么。
HTML解析器已经知道HTML的语法规则。必须为您编写的每个新RegEx教授正则表达式。 RegEx在某些情况下还可以,但实际上取决于您的用例。
您can write more reliable parsers,但是当上述库已经存在并且在此方面做得更好时,编写带有正则表达式的完整而可靠的自定义解析器会浪费时间。
另请参见Parsing Html The Cthulhu Way
图书
如果你想花一些钱,看看
PHP Architect's Guide to Webscraping with PHP
我不隶属于PHP Architect或作者。
关于php - 您如何在PHP中解析和处理HTML/XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646387/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!