Получить div вокруг искомого ключевого слова (file_get_contents('url')
Так что я создаю веб-сканер, и все работает, только 1 проблема.
С file_get_contents($page_data["url"]);
Я получаю содержание веб-страницы. Эта веб-страница сканируется, когда на ней присутствует одно из моих ключевых слов.
$find = $keywords; $str = file_get_contents($page_data["url"]);
if(strpos($str, $find) == true)
Когда я хочу вставить данные в базу данных mysql, я хочу получить только информацию внутри div, в котором находится ключевое слово.
Я знаю, что должен использовать DOM, но я новичок в сцене domdocument.
4 ответа
Я решил проблему с:
$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 />";
}
Я думаю, что есть некоторые проблемы с вашим желаемым решением:
- HTML-код может быть недействительным, и вы должны "починить" его, чтобы иметь возможность его проанализировать
- Информация может храниться не в DIV, а в TITLE, P, H1-H6, TD или чем-то еще
- Ключевое слово также может появляться в некоторых атрибутах, таких как мета-описание или мета-ключевые слова.
Обычно вы используете какой-либо запрос XPATH для поиска в дереве DOM, но я действительно не знаю, как искать узел, у которого есть дочерний узел типа "текстовый узел" с определенным ключевым словом в нем.
Возможно, вы захотите взглянуть на Lucene, который предлагает вам некоторые функции поисковой системы. Есть также несколько HTML-парсеров для Lucene, которые могут решить вашу проблему.
РЕДАКТИРОВАТЬ: Вы можете искать следующий тег "до" соответствующего ключевого слова, а затем искать следующий соответствующий закрывающий тег. Но на самом деле это не может быть закрывающий тег родительского DIV.
РЕДАКТИРОВАТЬ: я нашел вопрос о поиске текста в теге: как сопоставить текстовый узел, а затем следовать родительским узлам с помощью XPath. Поэтому вы можете попытаться импортировать весь HTML-код в SimpleXML или DOMDocument, а затем использовать XPath для поиска строки и родительского DIV.
$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 и т. Д.)
Может быть, это поможет в целом. Код найдет все элементы, имеющие атрибут 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";
}
}