Thứ Sáu, 18 tháng 2, 2011

Loại bỏ tag thừa khi crawler.

Khi tiến hành crawler tin chúng ta thường gặp một số vấn đề về thiếu thẻ đóng và mở do  các trang web viết code không chuẩn. Với những bài viết này có thể làm vỡ giao diện của bạn,nhất là việc thiếu thẻ đóng <div> hoặc <b>.Hàm check_tag giúp loại bỏ những thẻ thiếu thẻ đóng hoặc mở,đảm bảo lượng thẻ đóng và mở bằng nhau.Tuy nhiên với các thẻ lồng thì không hiệu quả cho lắm :D (vd:<table>,<ul>).Do cơ chế loại bỏ thẻ đóng và mở không hợp với các loại thẻ này :( . Bác nào có cách giải quyết với các thẻ này thì cho ý kiến nhé :D.

Tham số truyền vào hàm :

+ $str : là đoạn html truyền vào để loại bỏ thẻ.

+ $list_tag: danh sách các thẻ cần loại bỏ thẻ thiếu

vd: ta gọi hàm check_tag("<div>abc<b>tét ne :D</b>",array("div","b"))

function check_tag($str,$list_tag = array())
{
foreach($list_tag as $k=>$v)
{
$str = preg_replace("/[<]{1}[\/]{1}[ ]*({$v}){1}[ ]*[(>)]{0,1}/","</$v>",$str);
$arr[$k] = preg_split("/[(<)]{1}[ ]*({$v}){1}[ a-zA-Z \'\"=;:]*[(>)]{1}/",$str);

$arr1[$k] = preg_split("/[<]{1}[\/]{1}[ ]*({$v}){1}[ ]*[(>)]{1}/",$str);
if(count($arr[$k]) > count($arr1[$k]))
{
$key = count($arr[$k]) - count($arr1[$k]);

$count = count($arr[$k]);
for($i=0;$i < $key;$i++)
{
$save[$k][] = $arr[$k][($count-$i-1)];

unset($arr[$k][($count-$i-1)]);
}
if(!empty($save[$k]))
{
$str = implode("<".$v.">",$arr[$k]).implode('',$save[$k]);
} else {
$str = implode("<".$v.">",$arr[$k]);
}
}

if(count($arr[$k]) < count($arr1[$k]))
{
$key = count($arr1[$k]) - count($arr[$k]);

$count = count($arr1[$k]);
for($i=0;$i < $key;$i++)
{
$save[$k][] = $arr1[$k][($i)];

unset($arr1[$k][($i)]);
}

if(isset($save[$k]))
{
$str = implode('',$save[$k]).implode("</".$v.">",$arr1[$k]);
} else {
$str = implode("</".$v.">",$arr1[$k]);
}
}
}
return $str;
}

12 nhận xét:

  1. Em khong hieu may cho regxp. Bac comment ro mot cai cho em xem voi.

    Trả lờiXóa
  2. //loai bo khoang trang trong tag truyen vao voi tag dong
    $str = preg_replace(“/[<]{1}[\/]{1}[ ]*({$v}){1}[ ]*[(>)]{0,1}/”,””,$str);

    //cat string thanh mang theo tag truyen vao(doi voi tag mo)
    $arr[$k] = preg_split(“/[(<)]{1}[ ]*({$v}){1}[ a-zA-Z \'\"=;:]*[(>)]{1}/”,$str);

    //cat string thanh mang theo tag truyen vao(doi voi tag dong)
    $arr1[$k] = preg_split(“/[<]{1}[\/]{1}[ ]*({$v}){1}[ ]*[(>)]{1}/”,$str);

    Trả lờiXóa
  3. phản đối crawl nội dung website, crawl là làm giảm giá trị bài viết, phản đối! phản đối! :D

    Trả lờiXóa
  4. Hè anh hoàng im hơi lặng tiếng quá lâu lắm mới gặp :D.Hôm nào qua nhà daika đá ps3 đi anh :D

    Trả lờiXóa
  5. Bai viet tot :D. Dung nghe loi thang Hoang :))

    Trả lờiXóa
  6. Dụ đại ka chủ trì 1 vụ ăn chơi cuối tuần này đê, để còn qua nhà vùi dập đại ka vài (chục) bàn nhey :D

    Trả lờiXóa
  7. Vậy sao ko crawl text thôi, tab tủng vứt hết đi :>

    @all: Lâu lắm mới đông đủ a.e thế này nhỉ, hâm nóng lại i-php đi nào \:d/
    @a.Hoàng: hình như mấy lần anh gọi cho em ko được, em đổi số đt lâu rồi anh ơi. Em nt số mới cho all list mà anh ko nhận được à :-s

    Trả lờiXóa
  8. oạch craler mà toàn text thì nhìn bài viết ra cái gì :(.

    Trả lờiXóa
  9. giao diện của mình với site mình chôm là khác nhau, cái mình cần là nội dung. Crawl về toàn text (Title, Content, ....) riêng biệt. Mình echo title chỗ title, content chỗ content trong giao diện của mình, đẹp :X

    Trả lờiXóa
  10. Nhìn một bài viết không xuống dòng,không phân khối,dài khoảng vài chục dòng xem đọc có nhức măt không :(.Việc crawler phải đảm bảo được bài viết lấy về so với nguồn lấy không sai khác nhau nhiều.Chú này chưa hiểu công việc của crawler roi :(.

    Trả lờiXóa
  11. phần hiển thị content bài viết được out ra từ 1 editor nào đó nên cái này yên tâm là ít khi có chuyện sai tag. Quan trọng là mình Crawl đúng hay ko thôi.

    Trả lờiXóa
  12. Chú về làm thử mấy con crawler thì thấy ngay,xem tag nó có chuẩn không,nhất là mấy cái trang web từ thời lapoleon ấy :)).

    Trả lờiXóa