Home » Code » PHP解析HTML

PHP解析HTML

在百度搜索“PHP解析HTML”,出现最多的可能是simple_html_dom或者其他一些第三方类,号称能像jQuery一样使用各种选择器对HTML进行操作。我试用了,仅仅是将HTML load进去就卡爆了,在Chrome能吞掉2G以上内存,根本没法使用。还是得自己动手。

PHP本身有DOMDocment这个类可以对HTML进行解析,但一个网页里边各种HTML、CSS、Javascript代码混合乱七八糟,这个类进行loadHTML的时候经常报错。其实我们需要的也是整个网页中的一部分,可以先使用正则将需要的那一块匹配出来,这一块可能就是比较干净的HTML代码了,然后再这一块使用DOMDocument来处理。使用正则尽量通过唯一的id匹配,而且网页里边各种换行、空格、回车之类的,需要添加\s修饰符,或者先将这些特殊符号通过[\t\r\n]+替换掉再进行匹配。

将HTML载入DOMDocument时,必须是utf-8编码的字符,如果网页的编码不是utf-8,先通过iconv进行转换。而且很关键的一点,HTML代码中必须包含设置Content-Type和charset的meta标签,没错,就是下边这一句:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

如果没有这么一句,极有可能就是乱码。因此匹配到需要的HTML代码时,最好在前边追加这么一句。另外,通过getElementById(或其他选择器)获取元素时明明有这个id(选择器)的元素却得到NULL,那么,你还需要为HTML代码添加DOCTYPE声明,也就是这么一句:

<!DOCTYPE html>

在PHP 5.6.11中我得到的结果是没有这个声明没问题,但5.4.40中有问题。因此,最好也在开头追加上。

还有一点,通过getElementsByTagName得到的DOMNodeList对象,要获取第一个,在PHP 5.6.11中可以像数组一样的通过数字索引访问,但在PHP 5.4.40中不行,要获取第i个得通过item(i)方法进行获取。

以上是做PHP解析HTML时的一些收获,希望能帮到遇到同样问题的人们。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.