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
Last Updated: 8/3/2019, 11:39:58 PM