php抓取网页指定内容(PHP自带的方式解析分析,你真的了解吗?)
优采云 发布时间: 2022-03-04 20:11php抓取网页指定内容(PHP自带的方式解析分析,你真的了解吗?)
其实从 PHP5 开始,PHP 就为我们提供了一个强大的类,用于解析和生成 XML 相关的操作,这就是我们今天要讲的 DOMDocument 类。不过我估计大部分人在抓取网页的时候还是喜欢用正则表达式来解析网页的内容。今天学完这门课,大家可以尝试使用PHP自带的方法进行解析分析。
解析 HTML
// 解析 HTML
$baidu = file_get_contents('https://www.baidu.com');
$doc = new DOMDocument();
@$doc->loadHTML($baidu);
// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
// object(DOMElement)#2
// ....
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
$allImageLinks[] = $img->getAttribute('src');
}
print_r($allImageLinks);
// Array
// (
// [0] => //www.baidu.com/img/baidu_jgylogo3.gif
// [1] => //www.baidu.com/img/bd_logo.png
// [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )
// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
print_r(parse_url($link));
}
// Array
// (
// [host] => www.baidu.com
// [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
// [host] => www.baidu.com
// [path] => /img/bd_logo.png
// )
// Array
// (
// [scheme] => http
// [host] => s1.bdstatic.com
// [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
是不是感觉如此清晰和面向对象?感觉就像是第一次使用 ORM 库进行数据库操作。让我们一块一块地看。
$baidu = file_get_contents('https://www.baidu.com');
$doc = new DOMDocument();
@$doc->loadHTML($baidu);
首先是加载文档的内容,这很容易理解。使用 loadHTML() 方法直接加载 HTML 内容。它还提供了其他几种方法,即: load() 从文件中加载 XML;loadXML() 从字符串加载 XML;loadHTMLFile() 从文件加载 HTML。
// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
// object(DOMElement)#2
// ....
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
接下来我们使用与前端 JS 相同的 DOM 操作 API 来操作 HTML 中的元素。本例中,要获取百度的文本框,直接使用getElementById()方法获取id为指定内容的DOMElement对象。然后你可以得到它的值、属性等。
// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
$allImageLinks[] = $img->getAttribute('src');
}
print_r($allImageLinks);
// Array
// (
// [0] => //www.baidu.com/img/baidu_jgylogo3.gif
// [1] => //www.baidu.com/img/bd_logo.png
// [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )
// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
print_r(parse_url($link));
}
// Array
// (
// [host] => www.baidu.com
// [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
// [host] => www.baidu.com
// [path] => /img/bd_logo.png
// )
// Array
// (
// [scheme] => http
// [host] => s1.bdstatic.com
// [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
本示例是获取 HTML 文档中的所有图片链接。和正则相比,是不是方便多了,而且代码本身不言自明,所以不用考虑正则匹配失败的问题。配合另外一个PHP自带的parse_url()方法,分析链接,提取你想要的内容非常方便。
XML 的解析类似于 HTML 的解析。两者都可以通过使用 DOMDocument 和 DOMElement 提供的方法接口轻松解析。那么如果我们想生成一个标准格式的 XML 怎么办?当然,它也很简单。您不再需要拼接字符串。您可以使用此类执行面向对象的操作。
生成一个 XML
其实只要有一点前端JS基础,不难看出这段代码的意思。使用 createElement() 方法创建一个 DOMElement 对象,然后向它添加属性和内容。使用 appendChild() 方法将下级节点添加到当前 DOMElement 或 DOMDocument。最后,使用 saveXML() 生成标准的 XML 格式内容。
总结
通过上面两个简单的例子,相信大家已经对这个DOMDocument操作XML文件解析的方式很感兴趣了。但是,相对于正则解析的方式,它们的性能是不同的,没有找到相关的测试。但是,在正常情况下,网站 的 HMTL 文档不会太大。毕竟每个网站也会考虑自己的加载速度,如果文档很大,用户体验会很差,所以日常爬虫分析处理用这个接口基本没有问题。
测试代码:%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96% 87%E6%A1%A3.php
参考文档: