------
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. </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]
-----------