PHP 解析 html 类
写在最前面
本次教程,主要是将我最近制作的一个爬虫过程中的思路、方法以及技巧讲解一下,抓取目标是:飘花电影网。
说实话,由于 PHP 本身的限制,用于写爬虫效率比较低下,如果想制作一个高性能功能完善的爬虫,还是需要使用 Python 来写。
simple_html_dom
一、项目使用的第三方类库 simple_html_dom 是 GitHub 上一个开源的项目,基于 PHP 的 HTML 解析类库,当我们获取到一个网页的 HTML 之后,通过此类库即可以实现对 HTML 的解析工作,将我们指定的 DOM 元素中的重要数据提取出来,这也是爬虫的关键,抓取也马上所需要的有效数据。
simple_html_dom
中的方法
介绍 $html = file_get_html('http://paopaotv.com/tv-type-id-5-pg-1.html');
$e = $html->find("div", 0);
//标签
$e->tag;
//外文本
$e->outertext;
//内文本
$e->innertext;
//纯文本
$e->plaintext;
//子元素
$e->children ( [int $index] );
//父元素
$e->parent ();
//第一个子元素
$e->first_child ();
//最后一个子元素
$e->last_child ();
//后一个兄弟元素
$e->next_sibling ();
//前一个兄弟元素
$e->prev_sibling ();
//标签数组
$ret = $html->find('a');
//第一个a标签
$ret = $html->find('a', 0);
使用新的方式
include_once './simple_html_dom.php';
//获取html
$html = file_get_html('http://www.google.com/');
//获取html
$dom = new simple_html_dom();
//加载html
$dom->load($html);
// 获取所有的 img标签
foreach ($dom->find('img') as $element) {
//获取img标签数组
echo $element->src . '<br>'; //获取每个img标签中的src
}
// 获取所有的 a 标签
foreach ($dom->find('a') as $element) {
//获取每个a标签中的href
echo $element->href . '<br>';
}
//获取html
$html = file_get_html('http://slashdot.org/');
//new simple_html_dom对象
$dom = new simple_html_dom();
//加载html
$dom->load($html);
// 查找所有的 article 代码块
foreach ($dom->find('div.article') as $article) {
//plaintext 获取纯文本
$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);
// 通过字符串 创建 DOM 元素
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$dom = new simple_html_dom(); //new simple_html_dom对象</p><p>
$dom->load($html); //加载html
//class = 赋值 给第二个div的class赋值
$dom->find('div', 1)->class = 'bar';
$dom->find('div[id=hello]', 0)->innertext = 'foo'; //innertext内部文本 </p><p> </p><p>
echo $dom; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>
// Find all anchors, returns a array of element objects a标签数组
$ret = $html->find('a'); // Find (N)th anchor, returns element object or null if not found (zero based)第一个a标签
$ret = $html->find('a', 0); // Find lastest anchor, returns element object or null if not found (zero based)最后一个a标签
$ret = $html->find('a', -1); // Find all <div> with the id attribute
$ret = $html->find('div[id]'); // Find all <div> which attribute id=foo
$ret = $html->find('div[id=foo]');
// Find all element which id=foo
$ret = $html->find('#foo'); // Find all element which class=foo
$ret = $html->find('.foo'); // Find all element has attribute id
$ret = $html->find('*[id]'); // Find all anchors and images a标签与img标签数组
$ret = $html->find('a, img'); // Find all anchors and images with the "title" attribute
$ret = $html->find('a[title], img[title]');
// Find all <li> in <ul>
$es = $html->find('ul li'); //ul标签下的li标签数组 // Find Nested <div> tags
$es = $html->find('div div div'); //div标签下div标签下div标签数组 // Find all <td> in <table> which class=hello
$es = $html->find('table.hello td'); //table标签下td标签数组 // Find all td tags with attribite align=center in table tags
$es = $html->find('table td[align=center]');
//5.Element 的方法
$e = $html->find("div", 0); //$e 所拥有的方法如下表所示
//Attribute Name Usage
$e->tag; //标签
$e->outertext; //外文本
$e->innertext; //内文本
$e->plaintext; //纯文本 // Example
$html = str_get_html("<div>foo <b>bar</b></div>");
echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"
//6.DOM traversing 方法
//Method Description
$e->children($index); //子元素
$e->parent(); //父元素
$e->first_child(); // 第一个子元素
$e->last_child(); // 最后一个子元素
$e->next_sibling(); // 后一个兄弟元素
$e->prev_sibling(); // 前一个兄弟元素
// Example
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// or