Очистка HTML DOM с использованием PHP-класса Simple HTML DOM

У меня возникли проблемы с нацеливанием на «обычный текст» (имя автора) в этом фрагменте HTML.

У меня будет МНОГИЕ из них на странице... и я использую PHP-класс SIMPLE HTML DOM SCRAPER.

Находится здесь: http://sourceforge.net/projects/simplehtmldom/files/.

Это довольно приятно и довольно просто в использовании / понимании. Я просто немного застрял в том, как я могу настроить свой «обычный текст» (имя автора в этой демонстрации)

<tr>
    <td style="vertical-align: top;">Some Time xx:xx am</td>
    <td><a href="javascript:void(0)" onclick="window.open('link-path-url.ext'); return false;"><strong>Some Title</strong></a>&nbsp;&nbsp;<img alt="VIDEO" border="0" height="12" src="/images/template/video_icon.jpg" width="12" /><br />Author Name<em> - Institute Name</em></td>
</tr>

Мне нужно получить 4 значения из каждого «блока» следующим образом:

ссылка/путь - до сих пор правильно загружается

title - правильно захватывает до сих пор

имя автора – это имя автора, с которым у меня проблемы с таргетингом

название института - правильно схватил пока

Вот PHP, с которым я играл/тестировал до сих пор:

foreach($html->find('tbody td a') as $element){
    echo 'LINK: ' . $parsedLink = substr($element->onclick, 13, -17) . '<br>';
    $title = $element->find('strong',0);
    echo 'TITLE: '. $title . '<br>';
    $institute = $element->parent()->last_child();
    echo 'INSTITUTE: '. $institute . '<br>';
    //$author = $element->parent()->find('text');
    $author = $element->parent()->last_child()->prev_sibling();
    echo 'AUTHOR: '. $author . '<br>';
}

Я пробовал использовать внутренний текст, внешний текст, открытый текст, текстовые блоки и т. д.

но я НЕ могу настроить таргетинг на «обычный текст» (внутренний текст?), который находится перед элементом <em></em>? (текст имени автора)

Как я могу нацелить/захватить это значение/элемент/текст?


person whispers    schedule 20.01.2014    source источник


Ответы (2)


правильный способ нацеливания на вышеизложенное был/есть так:

foreach($html->find('tbody td a[onclick]') as $element){
    $parsedLink = substr($element->onclick, 13, -17);
    $title = $element->find('strong',0);
    $author = $element->parent()->find('text'); // <-- returns array
    $institute = $element->parent()->last_child();
    echo 'LINK: ' . $parsedLink . '<br>';    
    echo 'TITLE: '. $title . '<br>';    
    echo 'AUTHOR: '. $author[2] . '<br>';
    echo 'INSTITUTE: '. $institute . '<br>';     
}

надеюсь, это поможет другим!

Благодарность!

person whispers    schedule 21.01.2014

Лично мне надоело использовать простой html-парсер dom, проблемы с памятью в PHP. Простой HTML-парсер DOM просто доставил мне слишком много головной боли, и проблема существует слишком долго без хорошего решения, на мой вкус (я знаю, я знаю, вам просто нужно освободить память вручную, но попробуйте поработать с рекурсивными функциями... ). Правда в том, что самые простые решения — самые лучшие, поэтому я начал использовать комбинации функций взрыва(), которых достаточно для 98% всех моих проблем со скрейпингом (и намного быстрее, создание и уничтожение объекта dom занимает некоторое время). Попробуй это:

class Scrap {

    private $link;
    private $title;
    private $institute;
    private $author;
    private $html;

    function __construct($url) {
        $this->html = $this->curlDownload($url);
    }

    private function curlDownload($Url){
        if (!function_exists('curl_init')){
            die('Sorry cURL is not installed!');
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $Url);
        curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com");
        curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    function scrapLink() {
        if(empty($this->link)) {
            $link = explode('<td><a href="javascript:void(0)" onclick="window.open(\'', $this->html);
            $link = explode('\')', $link[1]);
            $link = $link[0];
            $this->link = $link;
        }
        return $this->link;
    }

    function scrapTitle() {
        if(empty($this->title)) {
            $title = explode('<td><a href="javascript:void(0)" onclick="window.open(\'link-path-url.ext\'); return false;"><strong>', $this->html);
            $title = explode('</strong>', $title[1]);
            $title = $title[0];
            $this->title = $title;
        }
        return $this->title;
    }

    function scrapInstitute() {
        if(empty($this->institute)) {
            $institute = explode('<td><a href="javascript:void(0)" onclick="window.open(\'link-path-url.ext\'); return false;"><strong>Some Title</strong></a>&nbsp;&nbsp;<img alt="VIDEO" border="0" height="12" src="/images/template/video_icon.jpg" width="12" /><br />Author Name<em> -', $this->html);
            $institute = explode('</em>', $institute[1])
            $institute = trim($institute[0]);
            $this->institute = $institute;
        }
        return $this->institute;
    }

    function scrapAuthor() {
        if(empty($this->author)) {
            $author = explode('<td><a href="javascript:void(0)" onclick="window.open(\'link-path-url.ext\'); return false;"><strong>Some Title</strong></a>&nbsp;&nbsp;<img alt="VIDEO" border="0" height="12" src="/images/template/video_icon.jpg" width="12" /><br />', $this->html);
            $author = explode('<em>', $author[1])
            $author = $author[0];
            $this->author = $author;
        }
        return $this->author;
    }

    function scrapAll() {
        $this->scrapLink();
        $this->scrapTitle();
        $this->scrapInstitute();
        $this->scrapAuthor();
        return array($this->link, $this->title, $this->institute, $this->author);
    }
}
person user2811538    schedule 21.01.2014