PHP &

3 Cevap php

Ben kendi bir web sitesi (sadece sunucuya gitmiyor html sürün) içine taramasını PHP ve XPath kullanıyorum ama bu hatayı alıyorum:

Catchable fatal error: Object of class DOMNodeList could not be converted to string in C:\wamp\www\crawler.php on line 46

Ayrıca ben hata googling denedim ama, sonunda, php belgelerinde sona erdi ve benim örnek tam olarak öğrendim zaten ben ne başlamıştı sadece görmek için bu satırı yankılanan çalıştım ama aynı hatayı alacağı php belgelerinde bir ben yerine bir XML, HTML ile çalışıyorum ... o yüzden yanlış bir fikrim yok dışında ... Burada benim kod ...

<?php
$html = file_get_contents('http://miurl.com/mipagina#0');
// create document object model
$dom = new DOMDocument();
// load html into document object model
@$dom->loadHTML($html);
// create domxpath instance
$xPath = new DOMXPath($dom);
// get all elements with a particular id and then loop through and print the href attribute
$elements = $xPath->query("//*[@class='nombrecomplejo']");
if ($elements != null) {
    foreach ($elements as $e) {
      echo parse_str($e);
    } 
}                                                   
?>


Edit

Aslında bu hat Ben başka şeyler yorumladı varken test oldu üzgünüm evet ... Ama hala hata var burada silindi.

3 Cevap

documentation göre, "$elements != null" onay gereksizdir. Belki sıfır uzunluğunda olacak olsa DOMXPath::query() her foreach döngü karıştırmayın, hangi, bir DOMNodeList dönecektir.

Ayrıca, elemanın metinsel gösterimini elde etmek için nodeValue mülkiyetin kullanımına dikkat:

$elements = $xPath->query("//*[@class='nombrecomplejo']");

foreach ($elements as $e) {
  echo $e->nodeValue;
}

Elindeki hata nedeni parse_str() , you tried passing in a DOMElement bir dize başka bir şey beslemek değil ki.

Sadece bir tahmindi, ama echo $elements; Doğru, satır 46 mi? Ben echo komutu bir dize veya öğeleri $ bir dize, dönüştürülebilen bir şey değildir bekliyor inanıyorum. Bu hat kaldırmayı deneyin.

Burada spesifik cevaplar, sadece hata ayıklama ipuçları.

Birincisi, gelen @ çıkarın

@$dom->loadHTML($html);

Bu size sorun hata ayıklama yardımcı olabilir burada bastıran olduğunuz bir uyarı var olabilir. LoadHTML yöntem her zaman kötü şekilde oluşmuş HTML ile baş edemez. Deftere örnekte, ben şu var

PHP Warning:  DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 109 in /Users/alanstorm/Desktop/foo.php on line 7

Bunu yapmak için güç varsa, tidy uzantısı yüklemek ve temiz bir belge almak için kullanabilirsiniz.

Ayrıca, $ html bir dize aslında var olduğundan emin olun. Eğer http üzerinde bir sayfa talep ediyoruz, çünkü bu IP nedense bloke ediliyor olabilir.

Sınıfları / nesnenin DOMDocument ailesi tam, "hard-core" nesne yönelimli arayüzler ile uğraşmak için kullanılan konum ile çalışmak zor olabilir.

Burada akılda tutulması gereken iki şey vardır

  1. Hemen hemen everything DomDocument bir yöntem tarafından döndürülen bir amacıdır

  2. Bu nesnelerin çoğu bir dizeye dönüştürülür olamaz

Eğer $ e yerine nedense bir düğümün bir NodeList demektir bir dize, bir DOMNodeList dönüştürmeye çalıştığınızda Yani, sizin kod hataları gibi dışarı bakar.

Belirli bir uzunlukta bir nodelist varsa yerine görmek için $ e-> uzunlukta dışarı yankılanan, ya da içinde ne olduğunu anlamaya $ e yineleme sahipsiniz. Ayrıca bir yankı ekleyebilirsiniz. '; Eğer döngü ve sonra XPath sorgusu sağlamak için nokta saymak olmayan bir sıfır uzunlukta bir şeyler dönüyor.

Benim tahminim Xpath burada sorgu boş bir düğüm listesini dönüyor olmasıdır. Bu HTML belgesi üzerinde XPath sorgusu çalıştırmak için Firefox xPath Checker ve bizi indirin. Yani sizin doğru XPath sahip emin olmak izin verir, ve sonra PHP bölümünü sergiyi konsantre olabilirsiniz. Ben örnek sayfa / kodu kullanarak kontrol ederken, ben boş bir sonuç var.

İyi şanslar!