Soru PHP'de HTML / XML'yi nasıl ayrıştırıp işlersiniz?


Bir HTML / XML'yi nasıl ayrıştırıp ondan bilgi nasıl çıkarabilirim?


1896
2017-08-26 17:19


Menşei




Cevaplar:


Yerel XML Uzantıları

Birini kullanmayı tercih ederim yerel XML uzantıları PHP ile birlikte geldikleri için, genellikle tüm 3. parti lib'lerden daha hızlıdır ve bana işaretlemenin üstündeki tüm kontrolü veririm.

DOM

DOM eklentisi, PHP API'sini PHP 5 ile DOM API aracılığıyla çalıştırmanıza izin verir. Bu, W3C'nin Belge Nesnesi Modeli Çekirdek Seviye 3'ün bir uygulamasıdır. Program ve komut dosyalarının dinamik olarak erişmesine ve güncellenmesine olanak veren bir platform ve dil-nötr arabirimi. Belgelerin içeriği, yapısı ve tarzı.

DOM, gerçek dünya (kırık) HTML'yi ayrıştırabilir ve değiştirebilir ve yapabilir XPath sorguları. Dayanmaktadır libxml.

DOM ile üretken hale gelmek biraz zaman alır, ancak bu sefer de IMO'ya değer. DOM bir dil-agnostik arayüzü olduğundan, pek çok dilde uygulamalar bulacaksınız, bu yüzden programlama dilinizi değiştirmeniz gerekiyorsa, o zaman bu dilin DOM API'sini nasıl kullanacağınızı bileceksiniz.

Basit bir kullanım örneği bulunabilir Bir A öğesinin href özniteliğini yakalama ve genel bir kavramsal bakışta bulunabilir. Php içinde DOMDocument

DOM uzantısı nasıl kullanılır StackOverflow üzerinde kapsamlı bir şekilde ele alınmıştırBu nedenle, kullanmayı seçerseniz, karşılaştığınız sorunların çoğunun, Yığın Taşması'nda arama / tarama yaparak çözülebileceğinden emin olabilirsiniz.

XMLReader

XMLReader uzantısı bir XML çekme ayrıştırıcısıdır. Okuyucu, belge akışında ilerleyen ve yoldaki her düğümde duran bir imleç görevi görür.

DOM gibi XMLReader, libxml tabanlıdır. HTML Ayrıştırıcı Modülünü nasıl tetikleyeceğimin farkında değilim, bu yüzden de kırık HTML'yi ayrıştırmak için XMLReader kullanmanız, DOM'yi kullanarak libxml'nin HTML Ayrıştırıcı Modülü'nü kullanmaya açıkça karar verebileceğinden daha az güçlü olabilir.

Temel kullanım örneği şu adreste bulunabilir: php kullanarak h1 etiketlerinden tüm değerleri alma

XML Ayrıştırıcı

Bu uzantı, XML ayrıştırıcıları oluşturmanıza ve farklı XML olayları için işleyicileri tanımlamanıza olanak tanır. Her XML ayrıştırıcısının ayrıca ayarlayabileceğiniz birkaç parametresi vardır.

XML Ayrıştırıcı kitaplığı da libxml temel alır ve bir SAX stil XML itme ayrıştırıcısı. Bellek yönetimi için DOM veya SimpleXML'den daha iyi bir seçenek olabilir, ancak XMLReader tarafından uygulanan çekme ayrıştırıcısından daha fazla çalışmak daha zor olacaktır.

SimpleXML

SimpleXML uzantısı, XML'i normal özellik seçicileri ve dizi yineleyicileriyle işlenebilen bir nesneye dönüştürmek için çok basit ve kolayca kullanılabilen bir araç takımı sağlar.

HTML'nin geçerli XHTML olduğunu biliyorsanız SimpleXML bir seçenektir. Bozuk HTML'yi ayrıştırmanız gerekiyorsa, SimpleXml'i bile dikkate almayın çünkü bu durum boğulmaya başlar.

Temel kullanım örneği şu adreste bulunabilir: CRUD düğümü ve xml dosyasının düğüm değerleri için basit bir program ve orada PHP Manual'da birçok ek örnek.


3. Parti Kütüphaneleri (libxml tabanlı)

Üçüncü taraf bir lib kullanmayı tercih ederseniz, aslında kullanan bir lib kullanmayı öneririm. DOM/libxml dize ayrıştırma yerine.

FluentDom

FluentDOM PHP'deki DOMDocument için jQuery benzeri bir akıcı XML arabirimi sağlar. Seçiciler, XPath veya CSS'de yazılır (bir CSS'den XPath dönüştürücüsüne). Mevcut versiyonlar DOM uygulama standart arayüzlerini genişletiyor ve DOM Living Standard'dan özellikler ekliyor. FluentDOM JSON, CSV, JsonML, RabbitFish ve diğerleri gibi formatları yükleyebilir. Besteci ile kurulabilir.

HtmlPageDom

Wa72 \ HtmlPageDom` HTML'nin kolayca işlenmesi için bir PHP kütüphanesidir   kullanarak belgeler gerektirir Domcrawler Gönderen Symfony2   bileşenler geçiş yapmak için   DOM ağacı ve DOM'ı işlemek için yöntemler ekleyerek genişletir   HTML belgelerinin ağacı.

phpQuery (yıllarca güncellenmemiş)

phpQuery, PHP5'te yazılmış jQuery JavaScript Kitaplığı'na dayanan ve ek Komut Satırı Arabirimi (CLI) sağlayan bir sunucu tarafı, zincirlenebilir, CSS3 seçici sürücü Belge Modeli (DOM) API'sidir.

Ayrıca bakınız: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom DOM belgeleri ve yapıları ile çalışmak için araçlar sağlar. Şu anda, hem XPath hem de CSS seçicilerini kullanan DOM belgelerini sorgulamak için birleşik bir arabirim sağlayan Zend_Dom_Query'yi sunuyoruz.

QueryPath

QueryPath XML ve HTML'yi işlemek için bir PHP kütüphanesidir. Sadece yerel dosyalarla değil, web servisleri ve veritabanı kaynakları ile de çalışmak üzere tasarlanmıştır. JQuery arabiriminin (CSS stili seçiciler dahil) çoğunu uygular, ancak sunucu tarafında kullanım için yoğun şekilde ayarlanmıştır. Besteci ile kurulabilir.

fDOMDocument

fDOMDocument, standart DOM'yi, PHP uyarıları veya bildirimleri yerine, hataların her anında istisnaları kullanmak için genişletir. Ayrıca, kolaylık sağlamak ve DOM kullanımını basitleştirmek için çeşitli özel yöntemler ve kısayollar da eklerler.

kılıç / xml

saber / xml, XMLReader ve XMLWriter sınıflarını basit bir "xml to object / array" eşleme sistemi ve tasarım deseni oluşturmak için saran ve genişleten bir kütüphanedir. XML yazma ve okuma tek geçişlidir ve bu nedenle hızlı ve büyük xml dosyalarında düşük bellek gerektirebilir.

FluidXML

FluidXML, özlü ve akıcı bir API ile XML işlemek için bir PHP kütüphanesidir.   Eğlenceli ve etkili olması için XPath ve akıcı programlama modelinden yararlanır.


3. Taraf (libxml tabanlı değil)

DOM / libxml üzerine inşa etme avantajı, yerel uzantıya dayalı olduğunuzdan kutunun dışında iyi bir performans elde etmenizdir. Ancak, tüm üçüncü taraf lib'leri bu rotayı aşmaz. Bunlardan bazıları aşağıda listelenmiştir

PHP Basit HTML DOM Ayrıştırıcısı

  • PHP5 + 'da yazılmış bir HTML DOM ayrıştırıcısı HTML'yi çok kolay bir şekilde değiştirmenize izin verir!
  • PHP 5+ gerektir.
  • Geçersiz HTML'yi destekler.
  • JQuery gibi seçicilere sahip bir HTML sayfasındaki etiketleri bulun.
  • Tek bir satırda HTML'den içerik ayıklayın.

Genellikle bu ayrıştırıcıyı önermiyorum. Kod tabanı korkunç ve ayrıştırıcının kendisi oldukça yavaş ve bellek aç. Tüm jQuery Seçiciler ( çocuk seçiciler) mümkün. Libxml tabanlı kitaplıklardan herhangi biri bunu kolayca geride bırakmalıdır.

PHP Html Ayrıştırıcısı

PHPHtmlParser, jQuery gibi herhangi bir css seçiciyi kullanarak etiketleri seçmenizi sağlayan basit, esnek bir html ayrıştırıcısıdır. Amaç, geçerli olsun ya da olmasın, html çıkarmanın hızlı ve kolay bir yolunu gerektiren araçların geliştirilmesinde yardımcı olmaktır! Bu proje orijinal olarak sunra / php-simple-html-dom-parser tarafından desteklenmekteydi, fakat destek durmuş gibi görünüyor, bu yüzden bu proje önceki çalışmasına adaptasyonum.

Yine, bu ayrıştırıcıyı tavsiye etmem. Yüksek CPU kullanımı ile oldukça yavaştır. Ayrıca, oluşturulan DOM nesnelerinin belleğini temizlemek için bir işlev yoktur. Bu sorunlar özellikle yuvalanmış döngülerle ölçeklenir. Dokümantasyonun kendisi yanlıştır ve 14 Nisan 16'dan beri düzeltmelere yanıt verilmeden yanlış yazılmıştır.

Ganon

  • Evrensel bir belirteç ve HTML / XML / RSS DOM Ayrıştırıcısı      
    • Unsurları ve niteliklerini manipüle etme yeteneği
    • Geçersiz HTML ve UTF8'i destekler
  • Elemanlarda gelişmiş CSS3 benzeri sorgular yapabilir (jQuery gibi - desteklenen ad alanları)
  • Bir HTML güzelleştiricisi (HTML Tidy gibi)      
    • CSS ve Javascript'i küçültün
    • Nitelikleri sırala, karakter durumunu değiştirme, doğru girinti, vb.
  • Genişletilebilir      
    • Geçerli karakter / jetona göre geri çağrıları kullanarak belgeleri ayrıştırma
    • Kolayca geçersiz kılmak için daha küçük işlevlerde ayrılmış işlemler
  • Hızlı ve kolay

Hiç kullanmadım. İyi olup olmadığını söyleyemem.


HTML 5

HTML5'i ayrıştırmak için yukarıdakileri kullanabilirsiniz, ancak quirks olabilir HTML5 işaretleme nedeniyle izin verir. Yani HTML5 için, özel bir ayrıştırıcı kullanmayı düşünmek istersiniz.

html5lib

Büyük masaüstü web tarayıcıları ile maksimum uyumluluk için WHATWG HTML5 spesifikasyonuna dayalı bir HTML ayrıştırıcısının bir Python ve PHP uygulamaları.

HTML5 sonuçlandırıldıktan sonra daha fazla ayrıştırıcı görebiliyoruz. W3'ün başlıklı bir blog yazısı da var. Html 5 ayrıştırma için nasıl yapılır Bu kontrol etmeye değer.


Ağ hizmetleri

PHP’yi programlama gibi hissetmiyorsanız, Web servislerini de kullanabilirsiniz. Genel olarak, bunlar için çok az fayda buldum, ama bu sadece ben ve kullanım durumlarım.

YQL

YQL Web Servisi, uygulamaların Internet'teki farklı kaynaklardan gelen verileri sorgulamasına, filtrelemesine ve birleştirmesine olanak tanır. YQL deyimleri, veritabanı deneyimine sahip herhangi bir geliştiriciye aşina olan SQL benzeri bir sözdizimine sahiptir.

ScraperWiki.

ScraperWiki'nin harici arayüzü, web'de veya kendi uygulamalarınızda kullanmak istediğiniz formdaki verileri çıkarmanızı sağlar. Ayrıca herhangi bir kazıyıcı durumu hakkında bilgi alabilirsiniz.


Düzenli ifadeler

Son ve en az tavsiye edilen, HTML’den veri ayıklayabilirsiniz düzenli ifadeler. Genelde HTML'de Normal İfadeler kullanmak önerilmez.

Biçimlendirmeyle eşleşen web'de bulacağınız parçacıkların çoğu kırılgandır. Çoğu durumda, sadece çok özel bir HTML parçası için çalışıyorlar. Küçük işaretleme, bir yerdeki boşlukları eklemek veya bir etiketteki öznitelikleri eklemek veya değiştirmek gibi, düzgün yazılmadığında RegEx'in başarısız olmasına neden olabilir. HTML'de RegEx'i kullanmadan önce ne yaptığınızı bilmelisiniz.

HTML ayrıştırıcıları zaten HTML'nin sözdizim kurallarını bilir. Yazdığınız her yeni RegEx için düzenli ifadeler öğretilmelidir. RegEx bazı durumlarda iyidir, ancak gerçekten kullanım durumunuza bağlıdır.

Sen daha güvenilir ayrıştırıcılar yazabilirama yazıyor eksiksiz ve güvenilir Düzenli ifadelerle özel ayrıştırıcı, önceden bahsedilen kitaplıklar zaten mevcut olduğunda ve bu konuda daha iyi bir iş çıkardığında zaman kaybıdır.

Ayrıca bkz. Html Cthulhu Yolu Ayrıştırma


Kitaplar

Biraz para harcamak istiyorsanız, bir göz atın

PHP Architect veya yazarlarla bağlı değilim.


1719
2017-08-26 17:18



@Gellendi, ihtiyaçlarınıza bağlı. CSS Seçici sorgularına ihtiyacım yok, bu yüzden DOM'yi yalnızca özel olarak kullanıyorum. phpQuery jQuery portu olmayı hedefliyor. Zend_Dom hafiftir. Hangisini en çok sevdiğini görmek için onları kontrol etmelisin. - Gordon
PHP Basit HTML DOM Ayrıştırıcı kullanmamanız için bir gerekçe var. - Petah
29 Mart 2012 itibariyle, DOM html5'i desteklemiyor, XMLReader HTML'yi desteklemiyor ve PHP için html5lib'deki son taahhüt Eylül 2009'da. HTML5, HTML4 ve XHTML'yi ayrıştırmak için ne kullanmalı? - Shiplu Mokaddim
@Jimmy cURL hakkında hiçbir şey içermez çünkü cURL HTML / XML ile ayrıştırmak ve işlemek için bir araç değildir. cURL, çeşitli ağ protokolleri için bir istemcidir. Örneğin, web sitelerini onunla getirebilirsiniz. Yukarıdaki kütüphanelerin çoğunun doğrudan uzak URL'leri yükleme yolları vardır. Bu nedenle, DOM’ın hiç bir şekilde cURL’e ihtiyacınız yoktur. loadHTMLFile(). - Gordon
@Nasha İstenmeyen türden Zalgo rantını kasıtlı olarak yukarıdaki listeden çıkardım çünkü kendi başına çok yararlı olmadığından ve yazıldığından bu yana bazı kargo kültüne yol açıyor. Bir regex bir çözüm olarak ne kadar uygun olursa olsun, insanlar bu bağlantıya tokat attılar. Daha dengeli bir görüş için lütfen bağlantıya bakın. did bunun yerine dahil et ve yorumlardan geç stackoverflow.com/questions/4245008/... - Gordon


Deneyin Basit HTML DOM Ayrıştırıcısı

  • HTML'yi çok kolay bir şekilde kullanmanıza izin veren, PHP 5+ ile yazılmış bir HTML DOM ayrıştırıcısı!
  • PHP 5+ gerektir.
  • Geçersiz HTML'yi destekler.
  • JQuery gibi seçicilere sahip bir HTML sayfasındaki etiketleri bulun.
  • Tek bir satırda HTML'den içerik ayıklayın.
  • İndir


Örnekler:


HTML öğeleri nasıl edinilir?

// 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>';


HTML öğeleri nasıl değiştirilir?

// 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;


HTML'den içerik ayıkla:

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


Kazıma 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



Öncelikle kötü DOM'lar, Invlid kodu, DNSBL motoruna karşı js analiz etmek için hazırlamam gereken şeyler var, bu da sitemi bir çerçeve etrafında oluşturduğum gibi kötü amaçlı sitelere / içeriğe de bakmak için kullanılacaktır. Temiz, okunabilir ve iyi yapılandırılmış olması gerekiyor. SimpleDim harika ama kod biraz dağınık - RobertPitt
@Robert ayrıca kontrol etmek isteyebilirsiniz htmlpurifier.org güvenlik ile ilgili şeyler için. - Gordon
Geçerli bir noktaya sahip: basitHTMLDOM genişletmek zor, dekoratör kalıbı kullanmazsanız hantaldır. Kendimi buldum titreme sadece alttaki sınıf (lar) da değişiklikler yapmak. - Erik
Yaptığım şey, html'yi SimpleDOM'e göndermeden önce düzenli bir şekilde çalıştı. - MB34
Bunu şu anda kullanıyorum, birkaç yüz URL'yi işlemek için bir projenin parçası olarak çalıştırıyorum. Çok yavaş ve düzenli zaman aşımları devam ediyor. Bu harika bir yeni başlayanlar dizisi ve öğrenmek için sezgisel olarak basit, ancak daha gelişmiş projeler için çok basit. - luke_mclachlan


Sadece kullan DomDocument> loadHTML () ve onunla yapılmalı. libxml'in HTML ayrıştırma algoritması oldukça iyi ve hızlıdır ve popüler inanışın aksine hatalı biçimlendirilmiş HTML'yi bozmaz.


224
2017-11-15 22:16



Doğru. Ve içeriğin ayıklanması için harika olan PHP'nin yerleşik XPath ve XSLTProcessor sınıflarıyla çalışır. - Kornel
Gerçekten karışık HTML için, her zaman bunu DOM'a teslim etmeden önce htmltidy ile çalıştırabilirsiniz. Ne zaman HTML'den veri kazıya ihtiyacım olursa, her zaman DOM veya en az simpleks kullanıyorum. - Frank Farmer
Yanlış biçimlendirilmiş HTML yükleme ile başka bir şey ayrıştırmayı durduracak uyarıları önlemek için libxml_use_internal_errors (true) çağrısı yapmak akıllıca olabilir. - Husky
Herhangi bir sorun olmadan yaklaşık 1000 html kaynağını (farklı karakter kümeleriyle kodlanmış çeşitli dillerde) ayrıştırmak için DOMDocument'i kullandım. Bununla kodlama sorunları yaşayabilirsiniz, ancak bunlar aşılamaz değildir. 3 şeyi bilmeniz gerekir: 1) loadHTML, kodlamayı belirlemek için meta etiketin karakter kümesini kullanır. 2) # 2, html içeriği bu bilgiyi içermiyorsa yanlış kodlama algılamaya yol açabilir 3) kötü UTF-8 karakterleri ayrıştırıcıyı tetikleyebilir. Bu gibi durumlarda, mb_detect_encoding () ve Simplepie RSS Parser'in geçici çözümler için kodun kötü amaçlı UTF-8 karakterlerini kodlamasını / dönüştürmesini / sıyırma işlemini bir arada kullanın. - Zero
DOM aslında XPath'i destekliyor, bir göz atın DOMXPath. - Ryan McCue


Neden olmasın ve ne zaman istersen düzenli ifadeler kullanıyor musunuz?

İlk kapalı, ortak bir yanlış isim: Regexps "ayrıştırma" HTML. Ancak regexler "Ayıkla" veri. Ayıklamak onlar için yapılan şeydir. Uygun SGML araç takımları veya temel XML ayrıştırıcıları üzerinde regex HTML ekstraksiyonunun en büyük dezavantajı sözdizimsel çabaları ve değişken güvenilirlikleridir.

Biraz güvenilir bir HTML ekstraksiyon ifadesi oluşturmayı düşünün:

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

Basit bir phpQuery veya QueryPath eşdeğerinden daha az okunabilir:

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

Ancak, yardımcı olabilecekleri özel kullanım durumları vardır.

  • Birçok DOM geçişi öneki HTML yorumlarını göstermez <!--Bununla birlikte, bazen ekstraksiyon için daha kullanışlı çapalardır. Özellikle pseudo-HTML varyasyonları <$var> veya SGML kalıntıları regexps ile evcilleştirmek kolaydır.
  • Çoğu zaman normal ifadeler işleme sonrası kaydedebilir. Bununla birlikte, HTML varlıkları genellikle manuel bakım gerektirir.
  • Ve son olarak, extremely basit görevler <img src = urls ayıklamak gibi, aslında olası bir araçtırlar. SGML / XML ayrıştırıcıları üzerindeki hız avantajı çoğunlukla bu çok basit ekstraksiyon prosedürleri için oynamak için geliyor.

Normal ifadeleri kullanarak bir HTML snippet'ini önceden ayıklamak bazen tavsiye edilebilir. /<!--CONTENT-->(.+?)<!--END-->/ve daha basit HTML ayrıştırıcısı önyüzlerini kullanarak kalanını işleyin.

Not: Aslında buna sahibim UygulamanınXML ayrıştırma ve alternatif ifadeleri alternatif olarak kullanıyorum. Geçen hafta PyQuery ayrışması kırıldı ve regex hala işe yaradı. Evet, garip ve kendimi açıklayamıyorum. Ama öyle oldu.
Bu yüzden lütfen regex = evil meme ile uyuşmadığı için gerçek dünyayla ilgili düşünceleri aşağı çekmeyin. Ama buna da fazla oy vermeyelim. Bu konu için sadece bir sidenote.


136
2018-05-01 02:04



DOMComment yorumları okuyabilir, bu nedenle Regex'i kullanmanın bir nedeni yoktur. - Gordon
SGML araç takımları veya XML ayrıştırıcıları gerçek dünya HTML'sini ayrıştırmak için uygun değildir. Bunun için sadece özel bir HTML ayrıştırıcısı uygun. - Alohci
@Alohci DOM kullanımları libxml ve libxml ayrı bir HTML ayrıştırıcısına sahiptir HTML ile yüklenirken kullanılacak modül loadHTML() bu yüzden çok fazla "gerçek dünya" (okunmuş) HTML'yi yükleyebilir. - Gordon
Eh, sadece "gerçek dünyadaki" bakış açınız hakkında bir yorum. Tabii, HTML ayrıştırırken Regex için yararlı durumlar var. Ayrıca GOTO’un kullanımı için de yararlı durumlar vardır. Ve değişken değişkenler için yararlı durumlar vardır. Öyleyse, belirli bir uygulama onu kullanmak için kesinlikle kod-çürütmez. Ama çok güçlü bir uyarı işareti. Ve ortalama geliştiricinin farkı söylemek için yeterince nüanslı olması muhtemel değildir. Genel bir kural olarak, Regex GOTO ve Değişken-Değişkenler tüm kötülüklerdir. Kötü olmayan kullanımlar vardır, ancak bunlar istisnalardır (ve o kadar nadirdir) ... (IMHO) - ircmaxell
@mario: Aslında, HTML kutu Normalde adil bir iş yapmanın bir kaçını almasına rağmen, normal ifadelerle "doğru şekilde" ayrıştırılmalıdır. Bu genel davada sadece kraliyet acısı. İyi tanımlanmış girdiye sahip belirli durumlarda, önemsizdir. Bu insanlar olduğu durumlar meli regex kullanıyor. Büyük eski aç ağır ayrıştırıcılar, genel durumlar için gerçekten ihtiyacınız olan şeydir, ancak bu çizgiyi çizecek sıradan kullanıcı için her zaman açık değildir. Hangi kod daha basit ve daha kolaydır, kazanır. - tchrist


phpQuery ve QueryPath akıcı jQuery API'sini çoğaltmada oldukça benzerdir. İşte bu yüzden de en kolay iki yaklaşım uygun şekilde PHP'de HTML'yi ayrıştırın.

QueryPath örnekleri

Temel olarak ilk olarak bir HTML dizesinden bir gecikebilir DOM ağacı oluşturun:

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

Sonuçta ortaya çıkan nesne, HTML belgesinin eksiksiz bir ağaç temsilini içerir. DOM yöntemleri kullanılarak geçebilir. Ancak ortak yaklaşım, JQuery'deki gibi CSS seçicilerini kullanmaktır:

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

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

Çoğunlukla basit kullanmak istersiniz #id ve .class veya DIV etiket seçicileri ->find(). Ama ayrıca kullanabilirsiniz XPath bazen daha hızlı olan ifadeler. Ayrıca tipik jQuery yöntemleri gibi ->children() ve ->text() ve özellikle ->attr() Doğru HTML parçalarını ayıklamayı basitleştirin. (Ve zaten SGML varlıklarının kodu çözüldü.)

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

QueryPath ayrıca yeni etiketleri akışa enjekte etmeyi de sağlar (->append) ve daha sonra çıktı ve güncelleştirilmiş bir belgeyi güzelleştirmek->writeHTML). Sadece hatalı biçimlendirilmiş HTML'yi değil, aynı zamanda çeşitli XML lehçelerini (ad boşluklarıyla) ayrıştırılamaz ve hatta HTML mikro biçimlerinden (XFN, vCard) veri ayıklayabilir.

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

.

phpQuery veya QueryPath?

Genel olarak QueryPath belgelerin işlenmesi için daha uygundur. PhpQuery ayrıca jQuery'ye daha yakından benzemek için bazı sözde AJAX yöntemlerini (yalnızca HTTP istekleri) uygular. Php Query'nin QueryPath'den daha hızlı olduğu söylenir (daha az genel özellik nedeniyle).

Farklılıklar hakkında daha fazla bilgi için bkz. tagbyte.org'dan geri dönüş makinesindeki bu karşılaştırma. (Özgün kaynak kayboldu, işte bir internet arşivi bağlantısı var. Evet, hala eksik sayfaları bulabilirsin, insanlar.)

Ve burada kapsamlı bir QueryPath tanıtımı.

Avantajları

  • Sadelik ve Güvenilirlik
  • Alternatif kullanımı kolay ->find("a img, a object, div a")
  • Uygun olmayan verilerin tekrarlanması (düzenli ifadelerin grepping ile karşılaştırılması)

126
2017-08-26 17:20





Basit HTML DOM, harika bir açık kaynak çözümleyicidir:

simplehtmldom.sourceforge

DOM öğelerini nesne yönelimli bir şekilde ele alır ve yeni yinelemenin uyumsuz kod için çok fazla kapsamı vardır. Ayrıca, bu etiket adının tüm öğelerinin tüm örneklerini döndürecek olan "bul" işlevi gibi JavaScript'te görebileceğiniz bazı harika işlevler de vardır.

Bunu bir çok araçta kullandım, birçok farklı türde web sayfasında test ettim ve bence harika çalışıyor.


85
2017-10-04 13:14





Burada bahsettiğim genel bir yaklaşım, HTML'yi çalıştırmaktır. Düzenligarantili geçerli XHTML'yi tükürmek üzere ayarlanabilir. Daha sonra herhangi bir eski XML kütüphanesini kullanabilirsiniz.

Fakat özel sorununuz için, bu projeye bir göz atmalısınız: http://fivefilters.org/content-only/ - değiştirilmiş bir versiyonu Okunabilirlik Bir sayfadan sadece metinsel içeriği (üstbilgileri ve altbilgileri değil) ayıklamak için tasarlanmış algoritma.


58
2017-11-06 21:02





1a ve 2 için: Yeni Symfony Componet sınıfı DOMCrawler'a oy veririm ( DomCrawler ). Bu sınıf, CSS Seçici'lerine benzer sorgulara izin verir. Gerçek dünyadaki örnekler için bu sunuma bir göz atın: Haber-of-the-Symfony2 dünya.

Bileşen bağımsız çalışmak üzere tasarlanmıştır ve Symfony olmadan kullanılabilir.

Tek dezavantajı sadece PHP 5.3 veya daha yeni bir sürümle çalışacak olmasıdır.


54
2018-04-14 19:08



jquery benzeri css sorguları iyi söylenir, çünkü w3c belgelerinde eksik olan bazı şeyler vardır, ancak jquery'de ekstra özellikler olarak mevcuttur. - Nikola Petkanski


Bu yaygın olarak adlandırılır ekran kazıma, bu arada. Bunun için kullandığım kütüphane Basit HTML Dom Ayrıştırıcı.


51
2018-01-05 14:49



Kesinlikle doğru değil (en.wikipedia.org/wiki/Screen_scraping#Screen_scraping). İpucu "ekran" içinde; Açıklanan durumda, ekran dahil değildir. Kuşkusuz ki, bu terim son zamanlarda çok fazla kötüye kullanmıştır. - Bobby Jack
Ekran kazıma işlemini yapmıyorum, ayrıştırılacak içerik sözleşmemdeki içerik tedarikçisi tarafından onaylanacaktır. - RobertPitt