получить div вокруг искомого ключевого слова (file_get_contents ('url') - PullRequest
0 голосов
/ 09 сентября 2010

Итак, я создаю веб-сканер, и все работает, только одна проблема.

С file_get_contents($page_data["url"]); Я получаю содержимое веб-страницы.Эта веб-страница сканируется, когда на ней появляется одно из моих ключевых слов.

$find = $keywords; $str = file_get_contents($page_data["url"]);

if(strpos($str, $find) == true)

Когда я хочу вставить данные в базу данных mysql, мне нужна только информация внутри div, в котором находится ключевое слово.

Я знаю, что должен использовать DOM, но я новичок в сцене с документами.

ПРИМЕР: http://crawler.tmp.remote.nl/example.php

Ответы [ 4 ]

0 голосов
/ 10 сентября 2010

Я решил проблему с:

    $doc = new DOMDocument();
    $doc->loadHTML($str);

    $xPath = new DOMXpath($doc);
    $xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '".strtoupper($keywords)."')]";
    $elements = $xPath->query($xPathQuery);

    if($elements->length > 0){

    foreach($elements as $element){
        print "Gevonden: " .$element->nodeValue."<br />";
    }
0 голосов
/ 09 сентября 2010

$ str = file_get_contents ($ page_data ["url"]);

if(strpos($str, $find) == true)
{   
    echo $page_data["referer_url"]. ' - gevonden';

    $keywords = $_POST['keywords'];
    if($page_data["header"]){
    echo "<table border='1' >";
    echo "<tr><td width='300'>Status:</td><td width='500'> ".strtok($page_data["header"], "\n")."</td></tr>";}
    else "<table border='1' >";

    // PRINT EERSTE LIJN

    echo "<tr><td>Page requested:</td><td> ".$page_data["url"]."</td></tr>";
    // PRINT STATUS WEBSITE

    // PRINT WEBPAGINA
    echo "<tr><td>Referer-page:</td><td> ".$page_data["referer_url"]."</td></tr>";

    // CONTENT ONTVANGEN?
    if ($page_data["received"]==true)
      echo "<tr><td>Content received: </td><td>".$page_data["bytes_received"] / 8 . " Kbytes</td></tr></table>";
    else
    {
      echo "<tr><td>Content:</td><td>Not received</td></tr></table>";
    }

    $domain = $_POST['domain'];
    $link = mysql_connect('localhost', 'crawler', 'password');

    if (!$link) 
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("crawler");
    if(empty($page_data["referer_url"]))
    $page_data["referer_url"] = $page_data["url"];

    strip_tags($str, '<p><b>');

    mysql_query("INSERT INTO crawler (id, domain, url, keywords, data) VALUES ('', '".$page_data["referer_url"]."', '".$page_data["url"]."', '".$keywords."', '".mysql_real_escape_string($str) . "' )");

    echo "<br><br>";
    echo str_pad(" ", 5000); // "Force flush", workaround
    flush();

}

Как вы видите, я уже нашел ключевые слова, теперь мне нужна часть вокруг них.Кто-то сказал мне, что я должен прочитать страницу в древовидной структуре, и после того, как я смогу использовать часть вокруг моего ключевого слова (div, p и т. Д.)

0 голосов
/ 09 сентября 2010

Может быть, это поможет в общем. Код найдет все элементы, имеющие атрибут id и текст, содержащий ключевое слово, а затем отобразит значение id и текстовое значение элемента (предполагается, что документ правильно сформирован):

$sxml = new SimpleXMLElement(file_get_contents($page_data['url']));

foreach ($sxml->xpath('//div[@id]') as $div) {
    if (strpos((string) $div, 'keyword') !== false) {
        echo $div->attributes()->id . ': ' . trim($div) . "\n";
    }
}
0 голосов
/ 09 сентября 2010

Я думаю, что есть некоторые проблемы с вашим желаемым решением:

  1. HTML-код может быть недействительным, и вы должны "починить" его, чтобы иметь возможность его проанализировать
  2. информация может храниться не в DIV, а в TITLE, P, H1-H6, TD или в чем-либо еще
  3. Ключевое слово также может появляться в некоторых атрибутах, таких как мета-описание или мета-ключевые слова.

Обычно вы использовали бы какой-нибудь запрос XPATH для поиска в дереве DOM, но я действительно не знаю, как искать узел, у которого есть дочерний узел типа "текстовый узел" с определенным ключевым словом в нем.

Возможно, вы захотите взглянуть на Lucene , который предлагает вам некоторые функции поисковой системы.Есть также некоторые HTML-парсеры для Lucene, которые могут решить вашу проблему.

РЕДАКТИРОВАТЬ : Вы можете искать следующий тег «перед» соответствующим ключевым словом и затем искать следующийсоответствующий закрывающий тег.Но на самом деле это может быть не закрывающий тег родительского DIV.

EDIT : я обнаружил вопрос о поиске текста в теге: Как сопоставить текстовый узелзатем следуйте по родительским узлам, используя XPath .Поэтому вы можете попытаться импортировать весь HTML-код в SimpleXML или DOMDocument, а затем использовать XPath для поиска строки и родительского DIV.

...