萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php提取網頁正文內容的例子

php提取網頁正文內容的例子

   因為難點在於如何去識別並保留網頁中的文章部分,而且刪除其它無用的信息,並且要做到通用化,不能像火車頭那樣根據目標站來制定采集規則,因為搜索引擎結果中有各種的網頁。

  抓回一個頁面的數據,如何匹配出正文部分,鄭曉在下班路上想了個思路是:

  1. 提取出body標簽部分–>剔除所有鏈接–>剔除所有script、注釋–>剔除所有空白標簽(包括標簽內不含中文的)–>獲取結果。

  2. 直接匹配出非鏈接的、 符合在div、p、h標簽中的中文部分???

  還是會有不少其它多余信息啊,比如底部信息等。。 如何搞?不知道大家有木有什麼思路或建議?

  這個類是從網上找到的一個php實現的提取網頁正文部分的算法,鄭曉在本地也測試了下,准確率非常高。

代碼如下  

<?php

class Readability {
// 保存判定結果的標記位名稱
const ATTR_CONTENT_SCORE = "contentScore";

// DOM 解析類目前只支持 UTF-8 編碼
const DOM_DEFAULT_CHARSET = "utf-8";

// 當判定失敗時顯示的內容
const MESSAGE_CAN_NOT_GET = "Readability was unable to parse this page for content.";

// DOM 解析類(PHP5 已內置)
protected $DOM = null;

// 需要解析的源代碼
protected $source = "";

// 章節的父元素列表
private $parentNodes = array();

// 需要刪除的標簽
// Note: added extra tags from http://www.45it.net

private $junkTags = Array("style", "form", "iframe", "script", "button", "input", "textarea",
"noscript", "select", "option", "object", "applet", "basefont",
"bgsound", "blink", "canvas", "command", "menu", "nav", "datalist",
"embed", "frame", "frameset", "keygen", "label", "marquee", "link");

// 需要刪除的屬性
private $junkAttrs = Array("style", "class", "onclick", "onmouseover", "align", "border", "margin");


/**
* 構造函數
* @param $input_char 字符串的編碼。默認 utf-8,可以省略
*/
function __construct($source, $input_char = "utf-8") {
$this->source = $source;

// DOM 解析類只能處理 UTF-8 格式的字符
$source = mb_convert_encoding($source, 'HTML-ENTITIES', $input_char);

// 預處理 HTML 標簽,剔除冗余的標簽等
$source = $this->preparSource($source);

// 生成 DOM 解析類
$this->DOM = new DOMDocument('1.0', $input_char);
try {
//libxml_use_internal_errors(true);

copyright © 萬盛學電腦網 all rights reserved