2014-10-16 2 views
1

У меня есть код php, который может извлекать категории продуктов на этом сайте: http://www.tradeindia.com/. До сих пор мне удалось извлечь только категории. Как сделать так, чтобы он также извлекал номера продуктов рядом с ним, так как он не был в имени какого-либо класса?Скребок сайта с использованием PHP

Мой код:

<?php 
//header('Content-Type: text/html; charset=utf-8'); 
$grep = new DoMDocument(); 
@$grep->loadHTMLFile("http://www.tradeindia.com/"); 
$finder = new DomXPath($grep); 
$class = "cate_menu"; 
$nodes = $finder->query("//*[contains(@class, '$class')]"); 

$total_L = 0; 
foreach ($nodes as $node) { 
$span = $node->childNodes; 
echo '<br>' . $span->item(0)->nodeValue . ' : '; 
} 

?> 

Исходный код с сайта:

<td align="left" style="padding-left:8px;color:blue"><a href=/Seller/Agriculture/ class="cate_menu" >Agriculture</a>(100892)</td> 
<td align="left" style="padding-left:8px;color:blue"><a href=/Seller/Apparel-Fashion/ class="cate_menu" >Apparel & Fashion</a>(237902)</td> 
<td align="left" style="padding-left:8px;color:blue"><a href=/Seller/Automobile/ class="cate_menu" >Automobile</a>(78614)</td> 

мне нужны цифры в скобках.

+0

регулярное выражение будет делать свою работу достаточно хорошо в этом случае. – Raptor

+0

если возможно, я хочу сделать это с помощью этого способа (domdocument) – Cael

+0

привет, cael, какие продукты вы соскабливаете? отличные продукты? – Ghost

ответ

3

Я не гутра xpath, но то, что я сделал бы, это нацелиться на первую эту конкретную таблицу с использованием этих категорий игл, а затем получить эти строки на основе этого и начать цикл по найденным строкам.

Грубый пример:

$grep = new DOMDocument(); 
@$grep->loadHTMLFile("http://www.tradeindia.com/"); 
$finder = new DOMXpath($grep); 

$products = array(); 
$nodes = $finder->query(" 
    //td[@class='showroom1'][contains(text(), 'CATEGORIES')] 
    /parent::tr/parent::table/parent::td/parent::tr 
    /following-sibling::tr 
    /td[1]/table/tr/td/table/tr 
"); 

if($nodes->length > 0) { 
    foreach($nodes as $tr) { 
     if($finder->evaluate('count(./td/a)', $tr) > 0) { 
      foreach($finder->query('./td/a[@class="cate_menu"]', $tr) as $row) { 
       $text = $row->nodeValue; 
       $number = $finder->query('./following-sibling::text()', $row)->item(0)->nodeValue; 
       $products[] = "$text $number"; 
      } 

     } 
    } 
} 

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

Sample Output

+0

спасибо, я пробовал, но кажется, что он может извлечь только первый столбец. Есть ли способ получить остальные 2 столбца? – Cael

+0

@Cael проверить мою ревизию снова, ее теперь исправлено – Ghost

+0

Спасибо за большую помощь :) – Cael

1

Поскольку номер находится между двумя скобками, это должно быть легко. Вы можете использовать такую ​​функцию;

function get_string_between($string, $start, $end) { 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

$product = get_string_between($htmlline, "(", ")"); 

Вам потребуется, чтобы каждая строка таблицы была вставлена ​​отдельно. Вы можете прокручивать массив строк, содержащих каждую строку; foreach($htmllines as $htmlline) или аналогичный.

Надеюсь, это поможет.

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