Cara menggunakan simple html dom find

Jika Anda perlu mem-parsing HTML, ekspresi reguler bukanlah cara yang tepat. Dalam tutorial ini, Anda akan belajar cara menggunakan open source, parser yang mudah dipelajari, membaca, memodifikasi, dan mengeluarkan HTML dari sumber eksternal. Menggunakan nettuts sebagai contoh, Anda akan belajar cara mendapatkan daftar semua artikel yang diterbitkan di situs dan menampilkannya.


Langkah 1. Persiapan

Hal pertama yang perlu Anda lakukan adalah mengunduh salinan perpustakaanHTHTMLdom sederhana, tersedia secara gratis dari sourceforge.

Ada beberapa file di download, tetapi satu-satunya yang Anda butuhkan adalah simple_html_dom.php file; sisanya adalah contoh dan dokumentasi.

Cara menggunakan simple html dom find


Langkah 2. Parsing dasar-dasar

Perpustakaan ini sangat mudah digunakan, tetapi ada beberapa dasar-dasar, Anda harus meninjau sebelum memasukkannya ke dalam tindakan.

Loading HTML

$html = new simple_html_dom();

// Load from a string
$html->load('<html><body><p>Hello World!</p><p>We're here</p></body></html>');

// Load a file
$html->load_file('http://net.tutsplus.com/');

Anda dapat membuat objek awal baik oleh loading HTML dari string, atau dari file. Memuat file dapat dilakukan baik melalui URL, atau melalui sistem file lokal Anda.

Peringatan: metode load_file() mendelegasikan tugasnya untuk PHP file_get_contents. Jika allow_url_fopen tidak diatur ke benar di file php.ini Anda, Anda mungkin tidak dapat membuka file jarak jauh dengan cara ini. Anda selalu bisa jatuh kembali Perpustakaan CURL untuk memuat halaman terpencil dalam kasus ini, kemudian membacanya dengan metode load().

Mengakses informasi

Cara menggunakan simple html dom find

Setelah Anda memiliki objek DOM Anda, Anda dapat mulai bekerja dengan itu dengan menggunakan find() dan menciptakan koleksi. A collection adalah sekelompok objek yang ditemukan melalui sebuah selector - sintaks yang sangat mirip dengan jQuery.

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>

Dalam contoh ini HTML, kita akan melihat bagaimana untuk mengakses informasi dalam paragraf kedua, mengubahnya, dan kemudian output hasil.

# create and load the HTML
include('simple_html_dom.php');
$html = new simple_html_dom();
$html->load("<html><body><p>Hello World!</p><p>We're here</p></body></html>");

# get an element representing the second paragraph
$element = $html->find("p");

# modify it
$element[1]->innertext .= " and we're here to stay.";

# output it!
echo $html->save();

Menggunakan metode find() selalu kembali kumpulan (array) Tag kecuali jika Anda menentukan bahwa Anda hanya ingin anak n, sebagai parameter kedua.

Baris 2-4: Load HTML dari string, seperti yang dijelaskan sebelumnya.

Jalur 7: Baris ini menemukan semua<p>Tag dalam HTML, dan mengembalikan mereka sebagai array. Paragraf pertama akan memiliki indeks 0, dan paragraf berikutnya akan diindeks sesuai.

baris 10: ini mengakses 2 item dalam koleksi kami paragraf (indeks 1), dan membuat tambahan untuk atribut innertext nya. Innertext mewakili isi antara tag, sementara outertext mewakili isi termasuk tag. Kami bisa mengganti tag sepenuhnya dengan menggunakan outertext.

Kita akan menambahkan satu lagi baris, dan memodifikasi kelas kami kedua ayat tag.

$element[1]->class = "class_name";
echo $html->save();

HTML dihasilkan menyimpan perintah akan:

<html>
<body>
    <p>Hello World!</p>
    <p class="class_name">We're here and we're here to stay.</p>
</body>
</html>

Penyeleksi lainnya

Berikut adalah beberapa contoh lain dari penyeleksi. Jika Anda telah menggunakan jQuery, ini akan tampak sangat akrab.

# get the first occurrence of id="foo"
$single = $html->find('#foo', 0);

# get all elements with class="foo"
$collection = $html->find('.foo');

# get all the anchor tags on a page
$collection = $html->find('a');

# get all anchor tags that are inside H1 tags
$collection = $html->find('h1 a');

# get all img tags with a title of 'himom'
$collection = $html->find('img[title=himom]');

Contoh pertama tidak sepenuhnya intuitif - semua pertanyaan secara default kembali koleksi, bahkan ID query, yang hanya harus mengembalikan hasil. Namun, dengan menetapkan parameter kedua, kami mengatakan "hanya kembali pertama item dari koleksi ini".

Ini berarti $single satu elemen, ketimbang array elemen dengan satu item.

Sisa dari contoh-contoh jelas.

Dokumentasi

Dokumentasi lengkap di Perpustakaan dapat ditemukan di halaman dokumentasi proyek.

Cara menggunakan simple html dom find


Langkah 3. Contoh dunia nyata

Untuk menempatkan Perpustakaan ini dalam tindakan, kita akan menulis sebuah skrip yang cepat untuk mengikis isi Nettuts website, dan menghasilkan daftar artikel yang hadir di situs dengan judul dan deskripsi... hanya sebagai contoh. Scraping adalah daerah yang rumit dari web, dan tidak boleh dilakukan tanpa izin.

Cara menggunakan simple html dom find

include('simple_html_dom.php');

$articles = array();
getArticles('http://net.tutsplus.com/page/76/');

Kita mulai dengan termasuk Perpustakaan, dan memanggil fungsi getArticles dengan halaman kami ingin mulai parsing. Dalam kasus ini kita mulai dekat ujung dan bersikap baik server Nettuts'.

Kami juga sedang mendeklarasikan array yang global untuk membuatnya sederhana untuk mengumpulkan semua informasi artikel di satu tempat. Sebelum kita mulai parsing, mari kita melihat bagaimana sebuah artikel ringkasan dijelaskan di Nettuts +.

<div class="preview">
    <!-- Post Taxonomies -->
    <div class="post_taxonomy"> ... </div>
    <!-- Post Title -->
    <h1 class="post_title"><a>Title</a></h1>
    <!-- Post Meta -->
    <div class="post_meta"> ... </div>
    <div class="text"><p>Description</p></div>
</div>

Ini mewakili format dasar posting di situs, termasuk komentar kode sumber. Mengapa Apakah komentar penting? Mereka dihitung sebagai node ke parser.


Langkah 4. Mulai fungsi Parsing

function getArticles($page) {
    global $articles;

    $html = new simple_html_dom();
    $html->load_file($page);

    // ... more ...
}

Kami mulai sangat sederhana dengan menyatakan global kami, membuat objek simple_html_dom baru, kemudian loading halaman kita ingin parse. Fungsi ini akan menyebut diri kemudian, jadi kita sedang menyiapkan itu untuk menerima URL sebagai parameter.


Langkah 5. Mencari informasi yang kami inginkan

Cara menggunakan simple html dom find

$items = $html->find('div[class=preview]');  

foreach($items as $post) {
    # remember comments count as nodes
    $articles[] = array($post->children(3)->outertext,
                        $post->children(6)->first_child()->outertext);
}

Ini adalah daging dari fungsi getArticles. Itu akan mengambil melihat lebih dekat untuk benar-benar memahami apa yang terjadi.

Jalur 1: Menciptakan serangkaian elemen - div dengan kelas pratinjau. Kami sekarang memiliki kumpulan artikel disimpan dalam $items.

Jalur 5: $post sekarang merujuk kepada satu div kelas pratinjau. Jika kita melihat HTML asli, kita dapat melihat bahwa anak ketiga adalah H1 berisi judul artikel. Kami mengambil dan menetapkannya ke $articles [indeks] [0].

Ingat untuk memulai pada 0 dan menghitung komentar ketika mencoba untuk menentukan indeks yang tepat dari sebuah node anak.

Jalur 6: Anak keenam $post adalah<div class="text">.</div> Kami ingin teks deskripsi dari dalam, sehingga kita ambil anak pertama outertext - ini akan mencakup ayat tag. Satu catatan data dalam artikel sekarang terlihat seperti ini:

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>
0

Langkah 6, Pagination

Hal pertama yang kita lakukan adalah menentukan bagaimana menemukan halaman kami berikutnya. Pada Nettuts +, URL mudah dimengerti, tetapi kita akan berpura-pura mereka tidak, dan mendapatkan link berikutnya melalui parsing.

Cara menggunakan simple html dom find

Jika kita melihat HTML, kita perhatikan yang berikut:

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>
1

Jika ada halaman berikutnya (dan tidak akan selalu ada), kita akan menemukan sebuah jangkar dengan kelas 'nextpostslink'. Sekarang bahwa informasi dapat diletakkan untuk menggunakan.

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>
2

Baris pertama, kita melihat jika kita dapat menemukan jangkar dengan kelas nextpostslink. Perhatikan parameter kedua untuk find(). Ini menentukan kami hanya ingin elemen pertama (indeks 0) koleksi ditemukan kembali. $next akan mengadakan hanya satu elemen, daripada kelompok elemen.

Selanjutnya, kami menetapkan link HREF untuk $URL variabel. Hal ini penting karena kita untuk menghancurkan objek HTML. Karena kebocoran memori melingkar referensi php5, objek simple_html_dom saat ini harus dibersihkan dan unset sebelum satu lagi dibuat. Kegagalan untuk melakukannya dapat menyebabkan Anda untuk memakan semua memori yang tersedia.

Akhirnya, kita memanggil getArticles dengan URL dari halaman berikutnya. Rekursi ini berakhir ketika ada lebih banyak halaman untuk mengurai.


Langkah 7 Keluaran hasil

Pertama kita akan mengatur sedikit stylings dasar. Ini benar-benar sewenang-wenang - Anda dapat membuat output Anda melihat namun Anda inginkan.

Cara menggunakan simple html dom find

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>
3

Selanjutnya kita akan menaruh sedikit kecil PHP di halaman untuk menampilkan informasi yang tersimpan sebelumnya.

<html>
<body>
    <p>Hello World!</p>
    <p>We're Here.</p>
</body>
</html>
4

Hasil akhir adalah satu HTML halaman daftar semua artikel, mulai pada halaman ditunjukkan oleh panggilan getArticles() pertama.


Langkah 8 kesimpulan

Jika Anda menguraikan banyak halaman (katakanlah, seluruh situs) mungkin perlu waktu lebih lama daripada waktu maksimum yang diizinkan oleh server Anda. Misalnya, menjalankan dari mesin lokal saya membutuhkan sekitar satu detik per halaman (termasuk waktu untuk mengambil).

Di situs seperti Nettuts, dengan 78 halaman tutorial saat ini, ini akan berjalan lebih dari satu menit.

Tutorial ini akan membantu Anda memulai dengan parsing HTML. Ada metode lain untuk bekerja dengan DOM, termasuk PHP built in one, yang memungkinkan Anda bekerja dengan penyeleksi xpath yang kuat untuk menemukan elemen. Untuk mudah digunakan, dan mulai cepat, saya menemukan perpustakaan ini menjadi salah satu yang terbaik. Sebagai catatan penutup, selalu ingat untuk mendapatkan izin sebelum menggores situs; ini penting. Terima kasih sudah membaca!