Очистить основной контент с помощью php - PullRequest
2 голосов
/ 08 марта 2019

Я создаю инструмент импорта точно так же, как инструмент импорта историй medium.com. До сих пор я использовал этот код

include('includes/import/simple_html_dom.php');
// get DOM from URL or file
$html = file_get_html('https://neilpatel.com/blog/starting-over/');

// find all link
foreach($html->find('a') as $e) 
    echo $e->href . '<br>';

// find all image
foreach($html->find('img') as $e)
    echo $e->src . '<br>';

// find all image with full tag
foreach($html->find('img') as $e)
    echo $e->outertext . '<br>';

// find all div tags with id=gbar
foreach($html->find('div#gbar') as $e)
    echo $e->innertext . '<br>';

// find all span tags with class=gb1
foreach($html->find('span.gb1') as $e)
    echo $e->outertext . '<br>';

// find all td tags with attribite align=center
foreach($html->find('td[align=center]') as $e)
    echo $e->innertext . '<br>';

// extract text from table
echo $html->find('td[align="center"]', 1)->plaintext.'<br><hr>';

// extract text from HTML
echo $html->plaintext;

Но это очищает всю страницу, можно просто найти и очистить только основное содержимое, как инструмент среднего импорта, выполняющий для любой ссылки

Пожалуйста, решите эту проблему и как я могу достичь такого результата

1 Ответ

1 голос
/ 08 марта 2019

Я не совсем уверен, что вы просите / пытаетесь сделать .. Но я попробую.

Вы пытаетесь определить область основного содержимого - чтобы очистить только необходимую информацию без какого-либо мусора или ненужного содержимого.

Мой подход заключается в использовании общих структур и передовых методов хорошо отформатированных HTML-страниц. Учтите это:

  • Основная статья будет заключена в уникальный тег ARTICLE на странице.
  • Тег H1 статьи будет ее заголовком.
  • Мы знаем, что используются некоторые повторяющиеся идентификаторы, такие как (main_content, main_article и т. Д.).

Суммируйте эти правила для ваших целей и создайте список идентификаторов, отсортированный по приоритету -> Затем вы можете попытаться проанализировать цель, пока не будет найден один из идентификаторов - что указывает на то, что вы идентифицировали основную область содержимого.

Вот пример -> используя предоставленный вами URL:

$search_logic = [
    "#main_content",
    "#main_article",
    "#main",
    "article",
];

// get DOM from URL or file
$html = file_get_contents('https://neilpatel.com/blog/starting-over/');
$dom = new DOMDocument ();
@$dom->loadHTML($html);

//
foreach ($search_logic as $logic) {

    $main_container = null;

    //Search by ID or By tag name:
    if ($logic[0] === "#") {
        //Serch by ID:
        $main_container = $dom->getElementById(ltrim($logic, '#'));
    } else {
        //Serch by tag name:
        $main_container = $dom->getElementsByTagName($logic);
    }

    //Do we have results:
    if (!empty($main_container)) {

        echo "> Found main part identified by: ".$logic."\n";
        $article = isset($main_container->length) ? $main_container[0] : $main_container; // Normalize the container.

        //Parse the $main_container:
        echo " - Example get the title:\n";
        echo "\t".$article->getElementsByTagName("h1")[0]->textContent."\n\n";

        //You can stop the iteration:
        //break;

    } else {
        echo "> Nothing on the page containing: ".$logic."\n\n";
    }
}

Как видите, первые идентификаторы не были найдены, поэтому мы продолжаем пробовать список до тех пор, пока не добьемся желаемого результата -> хороший набор этих тэгов / идентификаторов будет достаточно хорош.

Вот результат:

> Nothing on the page containing: #main_content

> Nothing on the page containing: #main_article

> Found main part identified by: #main
 - Example get the title:
    If I Had to Start All Over Again, I Would…

> Found main part identified by: article
 - Example get the title:
    If I Had to Start All Over Again, I Would…

Надеюсь, я помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...