2014-09-05 2 views
0

Здравствуйте, я напишу следующий код, чтобы извлечь имя и цену из таблицы с помощью XPATH и curl.свойство ошибки, отличной от объекта, в xpath

<?php 
    include_once ("xpath.php"); 
    header('Content-type: text/html; charset=UTF-8'); 
    $ch = curl_init ("http://emalls.ir/%D9%84%DB%8C%D8%B3%D8%AA-%D9%82%DB%8C%D9%85%D8%AA~Category~39~Search~Nokia"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    //$page = curl_exec($ch); 
    $page = utf8_decode(curl_exec($ch)); 

    $dom = new DOMDocument(); 
    libxml_use_internal_errors(true); 
    $dom->loadHTML($page); 
    libxml_clear_errors(); 
    $xpath = new DOMXpath($dom); 
    $data = array(); 


    // get all table rows and rows which are not headers 
    $produstname = $xpath->query('//table/tbody/tr/td/a/text()'); 
    $produstprice = $xpath->query('//table/tbody/tr/td[8]/text()'); 
    $data = array(); 
    for ($x=0; $x<=1; $x++){ 
     $data[$x]['title'] = $produstname->item($x)->nodeValue; 
     $data[$x]['price'] = $produstprice->item($x)->nodeValue; 
    } 
    ?> 

Следующие два XPATH работают на хроме, чтобы получить имя и цену.

name: $x("//table/tbody/tr/td/a/text()") 
price: $x("//table/tbody/tr/td[5]/text()") 

, но при использовании в следующий код дать эту ошибку

: Trying to get property of non-object in 
+1

* "в ..." * в чем ?! Ожидание убивает меня – Phil

+0

Может ли быть, может быть, нет 20 элементов, соответствующих вашим запросам XPath? – Phil

+0

, когда я набрал 1 элюмент, дайте эту ошибку. –

ответ

1

Я видел сайт, я смиренно предлагаю целевой атрибут id="" вместо этого. Вы также можете использовать foreach. Пример:

$ch = curl_init ("http://emalls.ir/%D9%84%DB%8C%D8%B3%D8%AA-%D9%82%DB%8C%D9%85%D8%AA~Category~39~Search~Nokia"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
$page = curl_exec($ch); 
$page = utf8_decode(curl_exec($ch)); 

$dom = new DOMDocument('1.0', 'utf-8'); 
libxml_use_internal_errors(true); 
$dom->loadHTML($page); 
libxml_clear_errors(); 
$xpath = new DOMXpath($dom); 

$data = array(); 
$table_rows = $xpath->query('//table[@id="grdprice"]/tr'); // target the row (the browser rendered <tbody>, but actually it really doesnt have one) 

if($table_rows->length <= 0) { // exit if not found 
    echo 'no table rows found'; 
    exit; 
} 

foreach($table_rows as $tr) { // foreach row 
    $row = $tr->childNodes; 
    if($row->item(0)->tagName != 'th') { // avoid headers 
     $data[] = array(
      'name' => trim($row->item(0)->nodeValue), 
      'price' => trim($row->item(7)->nodeValue), 
     ); 
    } 
} 

echo '<pre>'; 
print_r($data); 

Sample Output

+0

Thank's.You're профессиональный PHP. почему $ data [] .. is Empty –

+0

@amirrasabeh спасибо за дополнение, но нет, я даже не поцарапал поверхность PHP, все еще долгие пути, чтобы пойти – Ghost

+1

@amirrasabeh, что просто заявляет, что если вы этого не сделаете явно помещает индекс в присваивание, он добавит его в конец массива – Ghost

Смежные вопросы