Ngu ngơ học làm web (74) - Lấy tin từ Vnexpress

Tiếp theo của: Ngu ngơ học làm web (73) - Hàm preg_replace, lấy tỉ giá từ một website
------

Phần 74.       Lấy tin từ Vnexpress

Đây là clip số 71:


Ý tưởng làm phần này,

- Chép đoạn mã nguồn cần xử lý, dán vào trang https://regex101.com/, Ví dụ

<article class="list_news">
<h3 class="title_news">
<a href="https://vnexpress.net/tin-tuc/giao-duc/nguoi-dan-ong-vo-gia-cu-thanh-sinh-vien-dai-hoc-cambridge-3670012.html" title="Người đàn ông vô gia cư thành sinh viên Đại học Cambridge">
Người đàn ông vô gia cư thành sinh viên Đại học Cambridge </a>
<a class="icon_commend" href="https://vnexpress.net/tin-tuc/giao-duc/nguoi-dan-ong-vo-gia-cu-thanh-sinh-vien-dai-hoc-cambridge-3670012.html#box_comment" style="white-space: nowrap; display: none;">
<span class="txt_num_comment font_icon widget-comment-3670012-1"><i class="ic ic-comment ic-x ic-invert"><span>1</span></i></span>
</a>
</h3>
<div class="thumb_art">
<a class="thumb thumb_5x3" href="https://vnexpress.net/tin-tuc/giao-duc/nguoi-dan-ong-vo-gia-cu-thanh-sinh-vien-dai-hoc-cambridge-3670012.html" title="Người đàn ông vô gia cư thành sinh viên Đại học Cambridge">
<img src="https://i-vnexpress.vnecdn.net/2017/11/14/nguoidanongvogiacutrungtuyendaihoc1-1510625207_180x108.jpg" alt="Người đàn ông vô gia cư thành sinh viên Đại học Cambridge" class="lazyLoaded" data-was-processed="true">
</a>
</div>
<h4 class="description">
Đại học danh giá bậc nhất nước Anh nhận người đàn ông 52 tuổi vô gia cư, từng bán báo trên đường phố để kiếm sống.&nbsp; </h4>
</article>

- Thiết lập biểu thức chính quy để lấy dữ liệu theo yêu cầu. Lưu ý trong mỗi biểu thức chính quy dưới đây, các giá trị đặt trong dấu ngoặc đơn () sẽ được đặt trong một kết quả riêng, một phần tử của mảng kết quả - đây chính là chuỗi dữ liệu sẽ lấy ra. Ví dụ,

// lấy link
    $pattern = '/href="(.*)"/ismU';

// lấy hình ảnh
    $pattern = '/src="(.*)"/ismU';

// lấy tiêu đề
    $pattern = '/href=".*">(.*)<\/a>/ismU';

// lấy mô tả
    $pattern = '/class="description">(.*)<\/h4>/ismU';

- Gọi hàm preg_match của PHP để lấy dữ liệu

Ví dụ,

// lấy link
    $pattern = '/href="(.*)"/ismU';
    preg_match($pattern, $value, $link);
    $result[$key]['link'] = $link[1];
    // lấy hình ảnh
    $pattern = '/src="(.*)"/ismU';
    preg_match($pattern, $value, $image);
    $result[$key]['image'] = $image[1];
    // lấy tiêu đề
    $pattern = '/href=".*">(.*)<\/a>/ismU';
    preg_match($pattern, $value, $title);
    $result[$key]['title'] = trim($title[1]);
    // lấy mô tả
    $pattern = '/class="description">(.*)<\/h4>/ismU';
    preg_match($pattern, $value, $description);
    $result[$key]['description'] = trim($description[1]);

Lưu lại đoạn mã để tham khảo.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
<?php
  $pattern = '/<article class="list_news">(.*)<\/article>/ismU';
  $data = file_get_contents('https://vnexpress.net/tin-tuc/giao-duc') or die('Không đọc được dữ liệu');
  preg_match_all($pattern, $data, $matches);

  $result = array();
  foreach($matches[0] as $key => $value ) {
    // lấy link
    $pattern = '/href="(.*)"/ismU';
    preg_match($pattern, $value, $link);
    $result[$key]['link'] = $link[1];
    // lấy hình ảnh
    $pattern = '/src="(.*)"/ismU';
    preg_match($pattern, $value, $image);
    $result[$key]['image'] = $image[1];
    // lấy tiêu đề
    $pattern = '/href=".*">(.*)<\/a>/ismU';
    preg_match($pattern, $value, $title);
    $result[$key]['title'] = trim($title[1]);
    // lấy mô tả
    $pattern = '/class="description">(.*)<\/h4>/ismU';
    preg_match($pattern, $value, $description);
    $result[$key]['description'] = trim($description[1]);
  }

    echo '<pre>';
    print_r($result);
    echo '</pre>';

 ?>
</body>
</html>

Đây là clip số 72:


Tối ưu biểu thức chính quy và đổ dữ liệu lấy được ra trang HTML.

Sửa lại biểu thức chính quy để chỉ cần dùng một biểu thức có thể lấy được cả bốn thông tin (link, hình ảnh, tiêu đề, mô tả).

Đổ dữ liệu lấy được ra trang HTML.

Lưu lại đoạn mã để tham khảo:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
<?php
  $data = file_get_contents('https://vnexpress.net/tin-tuc/giao-duc') or die('Không đọc được dữ liệu');
  $pattern = '/<section class="sidebar_1">(.*)<\/section>/ismU';
  preg_match($pattern, $data, $matches);
  $pattern = '/<article class="list_news">(.*)<\/article>/ismU';
  preg_match_all($pattern, $matches[1], $matches);
 
  $result = array();
  foreach($matches[0] as $key => $value ) {
    if($key < 3) {
      $pattern = '/href="(.*)".*">(.*)<\/a>.*<a.*src="(.*)".*class="description">(.*)<\/h4>/ismU'; 
      preg_match($pattern, $value, $matches);
      $result[$key]['link'] = $matches[1];
      $result[$key]['title'] = trim($matches[2]);
      $result[$key]['image'] = $matches[3];
      $result[$key]['description'] = trim($matches[4]);
    } else {
      $pattern = '/href="(.*)".*">(.*)<\/a>.*<a.*src="(.*)".*data-original="(.*)".*class="description">(.*)<\/h4>/ismU';
      preg_match($pattern, $value, $matches);
      $result[$key]['link'] = $matches[1];
      $result[$key]['title'] = trim($matches[2]);
      $result[$key]['image'] = $matches[4];
      $result[$key]['description'] = trim($matches[5]);
    }
    
  }
 ?>
 <div class="container">
<?php
  foreach ($result as $key => $value) {
?>
   <div class="news">
     <img src="<?php echo $value['image']; ?>" alt="">
     <h3><a href="<?php echo $value['link']; ?>"><?php echo $value['title']; ?></a></h3>
     <p><?php echo $value['description']; ?></p>
   </div>
 <?php
 }
?>
 </div>
</body>

</html>
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web