Pertanyaan Bagaimana Anda mengurai dan memproses HTML / XML di PHP?


Bagaimana seseorang dapat mengurai HTML / XML dan mengekstrak informasi darinya?


1894
2017-08-26 17:19


asal


Jawaban:


Ekstensi XML Asli

Saya lebih suka menggunakan salah satu dari ekstensi XML asli karena mereka dibundel dengan PHP, biasanya lebih cepat daripada semua libs pihak ke-3 dan memberi saya semua kontrol yang saya perlukan atas markup tersebut.

DOM

Ekstensi DOM memungkinkan Anda untuk beroperasi pada dokumen XML melalui DOM API dengan PHP 5. Ini adalah implementasi dari W3C Document Object Model Core Level 3, sebuah platform dan antarmuka bahasa-netral yang memungkinkan program dan skrip untuk mengakses dan memperbarui secara dinamis isi, struktur dan gaya dokumen.

DOM mampu mem-parsing dan memodifikasi dunia nyata (rusak) HTML dan itu bisa dilakukan Kueri XPath. Itu didasarkan pada libxml.

Butuh waktu untuk menjadi produktif dengan DOM, tetapi waktu itu sangat layak untuk IMO. Karena DOM adalah antarmuka bahasa-agnostik, Anda akan menemukan penerapan dalam banyak bahasa, jadi jika Anda perlu mengubah bahasa pemrograman, kemungkinan Anda sudah tahu cara menggunakan API DOM bahasa itu.

Contoh penggunaan dasar dapat ditemukan di Meraih atribut href dari elemen A dan gambaran umum konseptual dapat ditemukan di DOMDocument dalam php

Cara menggunakan ekstensi DOM telah dicakup secara luas di StackOverflow, jadi jika Anda memilih untuk menggunakannya, Anda dapat yakin sebagian besar masalah yang Anda hadapi dapat diselesaikan dengan mencari / menelusuri Stack Overflow.

XMLReader

Ekstensi XMLReader adalah parser tarik XML. Pembaca bertindak sebagai kursor maju di aliran dokumen dan berhenti di setiap node di jalan.

XMLReader, seperti DOM, didasarkan pada libxml. Saya tidak mengetahui cara memicu Modul Parser HTML, sehingga kemungkinan menggunakan XMLReader untuk mengurai HTML yang rusak mungkin kurang kuat daripada menggunakan DOM di mana Anda dapat secara eksplisit memberitahukannya untuk menggunakan Modul Parser HTML libxml.

Contoh penggunaan dasar dapat ditemukan di mendapatkan semua nilai dari tag h1 menggunakan php

Parser XML

Ekstensi ini memungkinkan Anda membuat parser XML dan kemudian menentukan penangan untuk berbagai aktivitas XML. Setiap parser XML juga memiliki beberapa parameter yang dapat Anda sesuaikan.

Perpustakaan Parser XML juga didasarkan pada libxml, dan mengimplementasikan a SAKSOFON gaya parser XML push. Ini mungkin pilihan yang lebih baik untuk manajemen memori daripada DOM atau SimpleXML, tetapi akan lebih sulit untuk bekerja daripada parser tarik yang diimplementasikan oleh XMLReader.

SimpleXml

Ekstensi SimpleXML menyediakan toolset yang sangat sederhana dan mudah digunakan untuk mengkonversi XML ke objek yang dapat diproses dengan pemilih properti normal dan iterator array.

SimpleXML adalah pilihan ketika Anda tahu HTML adalah XHTML yang valid. Jika Anda perlu mengurai HTML yang rusak, jangan menganggap SimpleXml karena akan tersedak.

Contoh penggunaan dasar dapat ditemukan di Program sederhana untuk simpul CRUD dan nilai-nilai node file xml dan ada banyak contoh tambahan dalam Manual PHP.


Perpustakaan Pihak ke-3 (berbasis libxml)

Jika Anda lebih suka menggunakan lib pihak ke-3, saya sarankan menggunakan lib yang benar-benar digunakan DOM/libxml di bawahnya alih-alih string parsing.

FluentDom

FluentDOM menyediakan antarmuka XML halus seperti jQuery untuk DOMDocument di PHP. Pemilih ditulis dalam XPath atau CSS (menggunakan CSS ke XPath converter). Versi saat ini memperpanjang antarmuka standar yang menerapkan DOM dan menambahkan fitur dari DOM Living Standard. FluentDOM dapat memuat format seperti JSON, CSV, JsonML, RabbitFish, dan lainnya. Dapat diinstal melalui Composer.

HtmlPageDom

Wa72 \ HtmlPageDom` adalah pustaka PHP untuk memudahkan manipulasi HTML   dokumen yang dibutuhkan DomCrawler dari Symfony2   komponen untuk melintasi   Pohon DOM dan memanjangnya dengan menambahkan metode untuk memanipulasi DOM   pohon dokumen HTML.

phpQuery (tidak diperbarui selama bertahun-tahun)

phpQuery adalah Server-side, chainable, CSS3 selector driven Document Object Model (DOM) API berdasarkan jQuery JavaScript Library yang ditulis dalam PHP5 dan menyediakan tambahan Command Line Interface (CLI).

Juga lihat: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom menyediakan alat untuk bekerja dengan dokumen dan struktur DOM. Saat ini, kami menawarkan Zend_Dom_Query, yang menyediakan antarmuka terpadu untuk permintaan dokumen DOM menggunakan pemilih XPath dan CSS.

QueryPath

QueryPath adalah perpustakaan PHP untuk memanipulasi XML dan HTML. Ini dirancang untuk bekerja tidak hanya dengan file lokal, tetapi juga dengan layanan web dan sumber daya basis data. Ini mengimplementasikan banyak antarmuka jQuery (termasuk pemilih gaya CSS), tetapi sangat disesuaikan untuk penggunaan sisi-server. Dapat diinstal melalui Composer.

fDOMDocument

fDOMDocument memperluas DOM standar untuk menggunakan pengecualian pada semua kesempatan kesalahan, bukan peringatan atau pemberitahuan PHP. Mereka juga menambahkan berbagai metode kustom dan cara pintas untuk kenyamanan dan untuk menyederhanakan penggunaan DOM.

saber / xml

saber / xml adalah pustaka yang membungkus dan memperluas kelas XMLReader dan XMLWriter untuk membuat sistem pemetaan "sederhana xml to object / array" dan pola desain. Menulis dan membaca XML adalah single-pass dan karenanya dapat menjadi cepat dan memerlukan memori rendah pada file xml besar.

FluidXML

FluidXML adalah pustaka PHP untuk memanipulasi XML dengan API ringkas dan lancar.   Ini memanfaatkan XPath dan pola pemrograman fasih menjadi menyenangkan dan efektif.


Pihak ke-3 (tidak berbasis libxml)

Manfaat membangun pada DOM / libxml adalah Anda mendapatkan kinerja yang baik di luar kotak karena Anda didasarkan pada ekstensi asli. Namun, tidak semua libs pihak ke-3 turun rute ini. Beberapa di antaranya tercantum di bawah ini

PHP Simple HTML DOM Parser

  • Sebuah parser DOM HTML yang ditulis dalam PHP5 + memungkinkan Anda memanipulasi HTML dengan cara yang sangat mudah!
  • Perlu PHP 5+.
  • Mendukung HTML yang tidak valid.
  • Temukan tag pada halaman HTML dengan pemilih seperti jQuery.
  • Ekstrak konten dari HTML dalam satu baris.

Saya biasanya tidak merekomendasikan parser ini. Basis kode mengerikan dan parser sendiri agak lambat dan memori lapar. Tidak semua pemilih jQuery (seperti pemilih anak) mungkin. Pustaka berbasis libxml mana pun akan lebih baik daripada ini.

PHP Html Parser

PHPHtmlParser adalah parser html sederhana, fleksibel, yang memungkinkan Anda memilih tag menggunakan pemilih css apa pun, seperti jQuery. Tujuannya adalah membantu pengembangan alat yang membutuhkan cara cepat dan mudah untuk menghapus html, apakah itu valid atau tidak! Proyek ini asli didukung oleh sunra / php-simple-html-dom-parser tetapi dukungan tampaknya telah berhenti sehingga proyek ini adalah adaptasi saya dari pekerjaan sebelumnya.

Sekali lagi, saya tidak akan merekomendasikan parser ini. Ini agak lambat dengan penggunaan CPU yang tinggi. Juga tidak ada fungsi untuk menghapus memori dari objek DOM yang dibuat. Masalah-masalah ini skala terutama dengan loop bersarang. Dokumentasi itu sendiri tidak akurat dan salah eja, tanpa respons perbaikan sejak 14 April 16.

Ganon

  • Sebuah tokenizer universal dan HTML / XML / RSS DOM Parser      
    • Kemampuan untuk memanipulasi elemen dan atributnya
    • Mendukung HTML dan UTF8 yang tidak valid
  • Dapat melakukan kueri seperti CSS3 lanjutan pada elemen (seperti jQuery - namespace didukung)
  • Pemulas HTML (seperti HTML Tidy)      
    • Perkecil CSS dan Javascript
    • Atribut semacam, ubah huruf besar-kecil, lekukan yang benar, dll.
  • Dapat diperluas      
    • Mem-parsing dokumen menggunakan callback berdasarkan karakter / token saat ini
    • Operasi dipisahkan dalam fungsi yang lebih kecil untuk mudah diganti
  • Cepat dan Mudah

Tidak pernah menggunakannya. Tidak tahu apakah itu bagus.


HTML 5

Anda dapat menggunakan di atas untuk menguraikan HTML5, namun bisa ada quirks karena HTML5 markup memungkinkan. Jadi untuk HTML5 Anda ingin mempertimbangkan menggunakan parser khusus, seperti

html5lib

Implementasi Python dan PHP dari parser HTML berdasarkan spesifikasi WHATWG HTML5 untuk kompatibilitas maksimum dengan browser web desktop utama.

Kami mungkin akan melihat parser khusus setelah HTML5 selesai. Ada juga sebuah blogpost dengan judul W3 How-To untuk html 5 parsing yang layak untuk dicoba.


Layanan web

Jika Anda tidak ingin pemrograman PHP, Anda juga dapat menggunakan layanan Web. Secara umum, saya menemukan sangat sedikit utilitas untuk ini, tapi itu hanya saya dan kasus penggunaan saya.

YQL

Layanan Web YQL memungkinkan aplikasi untuk meminta, menyaring, dan menggabungkan data dari berbagai sumber di Internet. Pernyataan YQL memiliki sintaks seperti SQL, akrab bagi pengembang apa pun dengan pengalaman basis data.

ScraperWiki.

Antarmuka eksternal ScraperWiki memungkinkan Anda mengekstrak data dalam bentuk yang Anda inginkan untuk digunakan di web atau di aplikasi Anda sendiri. Anda juga dapat mengekstrak informasi tentang kondisi scraper apa pun.


Ekspresi Reguler

Terakhir dan paling tidak direkomendasikan, Anda dapat mengekstrak data dari HTML dengan ekspresi reguler. Secara umum menggunakan Regular Expressions pada HTML tidak disarankan.

Sebagian besar cuplikan yang akan Anda temukan di web untuk mencocokkan markup adalah rapuh. Dalam kebanyakan kasus, mereka hanya bekerja untuk bagian HTML yang sangat khusus. Perubahan markup kecil, seperti menambahkan spasi putih di suatu tempat, atau menambahkan, atau mengubah atribut dalam tag, dapat membuat RegEx gagal ketika tidak ditulis dengan benar. Anda harus tahu apa yang Anda lakukan sebelum menggunakan RegEx pada HTML.

Pengurai HTML sudah tahu aturan sintaksis HTML. Ekspresi reguler harus diajarkan untuk setiap RegEx baru yang Anda tulis. RegEx baik-baik saja dalam beberapa kasus, tetapi itu benar-benar tergantung pada use case Anda.

Kamu dapat menulis parser yang lebih andal, tetapi menulis a lengkap dan dapat diandalkan pengurai khusus dengan ekspresi reguler adalah pemborosan waktu ketika pustaka tersebut sudah ada dan melakukan pekerjaan yang jauh lebih baik dalam hal ini.

Juga lihat Mengurai Html Cara Cthulhu


Buku-buku

Jika Anda ingin menghabiskan uang, lihatlah

Saya tidak berafiliasi dengan PHP Architect atau penulisnya.


1718
2017-08-26 17:18



Mencoba Parser HTML Sederhana DOM

  • Sebuah parser DOM HTML yang ditulis dalam PHP 5+ yang memungkinkan Anda memanipulasi HTML dengan cara yang sangat mudah!
  • Perlu PHP 5+.
  • Mendukung HTML yang tidak valid.
  • Temukan tag pada halaman HTML dengan pemilih seperti jQuery.
  • Ekstrak konten dari HTML dalam satu baris.
  • Unduh


Contoh:


Cara mendapatkan elemen HTML:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


Cara memodifikasi elemen HTML:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Ekstrak konten dari HTML:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Menggores Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

303
2017-11-26 20:02



Cukup gunakan DOMDocument-> loadHTML () dan selesai dengan itu. algoritma penguraian HTML libxml cukup baik dan cepat, dan bertentangan dengan kepercayaan populer, tidak tersedak pada HTML yang cacat.


224
2017-11-15 22:16



Mengapa Anda tidak seharusnya dan kapan seharusnya menggunakan ekspresi reguler?

Pertama, salah nama umum: Regexps bukan untuk "parsing" HTML. Regexes bisa "ekstrak" data. Ekstrak adalah apa yang mereka buat. Kelemahan utama ekstraksi HTML regex atas toolkit SGML yang tepat atau parser XML awal adalah upaya sintaksisnya dan berbagai keandalannya.

Pertimbangkan untuk membuat regex ekstraksi HTML yang dapat diandalkan:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

jauh lebih mudah dibaca daripada persamaan phpQuery atau QueryPath sederhana:

$div->find(".stationcool a")->attr("title");

Namun ada kasus penggunaan khusus di mana mereka dapat membantu.

  • Banyak frontend traversal DOM tidak mengungkapkan komentar HTML <!--Namun, kadang-kadang jangkar yang lebih berguna untuk ekstraksi. Terutama variasi pseudo-HTML <$var> atau residu SGML mudah dijinakkan dengan regexps.
  • Seringkali ekspresi reguler dapat menyimpan pasca-pemrosesan. Namun entitas HTML sering membutuhkan pemeliharaan manual.
  • Dan terakhir, untuk etugas xtremely sederhana seperti mengekstrak <img src = url, mereka sebenarnya alat yang mungkin. Kelebihan kecepatan atas parser SGML / XML kebanyakan hanya dimainkan untuk prosedur ekstraksi dasar ini.

Terkadang disarankan untuk mengekstrak cuplikan HTML menggunakan ekspresi reguler /<!--CONTENT-->(.+?)<!--END-->/dan proses sisanya menggunakan frontars parser HTML yang lebih sederhana.

catatan: Saya benar-benar memiliki ini aplikasi, di mana saya menggunakan penguraian XML dan ekspresi reguler secara bergantian. Baru minggu lalu parsing PyQuery rusak, dan regex masih bekerja. Ya aneh, dan saya tidak bisa menjelaskannya sendiri. Tapi begitulah yang terjadi.
Jadi tolong jangan pilih pertimbangan dunia nyata, hanya karena tidak cocok dengan regex = evil meme. Tapi mari juga jangan terlalu banyak memilih ini. Itu hanya sidenote untuk topik ini.


136
2018-05-01 02:04



phpQuery dan QueryPath sangat mirip dalam mereplikasi API jQuery yang fasih. Itu juga mengapa mereka adalah dua pendekatan yang paling mudah tepat parsing HTML dalam PHP.

Contoh untuk QueryPath

Pada dasarnya Anda pertama kali membuat pohon DOM queryable dari string HTML:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

Objek yang dihasilkan berisi representasi pohon lengkap dari dokumen HTML. Ini dapat dilalui menggunakan metode DOM. Tetapi pendekatan umum adalah menggunakan pemilih CSS seperti di jQuery:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

Sebagian besar Anda ingin menggunakan sederhana #id dan .class atau DIV selektor tag untuk ->find(). Tetapi Anda juga bisa menggunakannya XPath pernyataan, yang terkadang lebih cepat. Juga metode jQuery seperti biasa ->children() dan ->text() dan khususnya ->attr() menyederhanakan mengekstraksi cuplikan HTML yang tepat. (Dan sudah memiliki entitas SGML mereka diterjemahkan.)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath juga memungkinkan menyuntikkan tag baru ke dalam aliran (->append), dan kemudian output dan prettify dokumen yang diperbarui (->writeHTML). Tidak hanya dapat mem-parse HTML yang cacat, tetapi juga berbagai dialek XML (dengan ruang nama), dan bahkan mengekstrak data dari mikroformat HTML (XFN, vCard).

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery atau QueryPath?

Umumnya QueryPath lebih cocok untuk manipulasi dokumen. Sementara phpQuery juga mengimplementasikan beberapa metode pseudo AJAX (hanya permintaan HTTP) untuk lebih mirip jQuery. Dikatakan bahwa phpQuery sering lebih cepat daripada QueryPath (karena lebih sedikit fitur keseluruhan).

Untuk informasi lebih lanjut tentang perbedaan, lihat perbandingan ini pada mesin perjalanan dari tagbyte.org. (Sumber asli hilang, jadi inilah tautan arsip internet. Ya, Anda masih bisa menemukan halaman yang hilang, orang.)

Dan inilah dia pengenalan QueryPath komprehensif.

Keuntungan

  • Kesederhanaan dan Kehandalan
  • Mudah digunakan alternatif ->find("a img, a object, div a")
  • Unescaping data yang tepat (dibandingkan dengan grepping ekspresi reguler)

126
2017-08-26 17:20



DOM HTML Sederhana adalah parser open-source yang hebat:

simplehtmldom.sourceforge

Ini memperlakukan elemen DOM dengan cara yang berorientasi objek, dan iterasi baru memiliki banyak cakupan untuk kode yang tidak patuh. Ada juga beberapa fungsi hebat seperti yang Anda lihat di JavaScript, seperti fungsi "find", yang akan mengembalikan semua elemen elemen dari nama tag tersebut.

Saya telah menggunakan ini di sejumlah alat, mengujinya di berbagai jenis halaman web, dan saya pikir itu berfungsi dengan baik.


85
2017-10-04 13:14



Satu pendekatan umum yang belum saya lihat di sini adalah menjalankan HTML Rapi, yang dapat diatur untuk mengeluarkan XHTML yang dijamin valid. Kemudian Anda dapat menggunakan pustaka XML lama di atasnya.

Tetapi untuk masalah khusus Anda, Anda harus melihat proyek ini: http://fivefilters.org/content-only/ - Ini adalah versi modifikasi dari Keterbacaan algoritma, yang dirancang untuk mengekstrak hanya konten tekstual (bukan header dan footer) dari halaman.


58
2017-11-06 21:02