获取搜索关键字的div(file_get_contents('url')

时间:2010-09-09 11:52:38

标签: php html web-crawler domdocument

所以即时创建一个webcrawler并且一切正常,只有1个问题。

使用file_get_contents($page_data["url"]);我获取网页的内容。当我的某个关键字在网页上显示时,会扫描此网页。

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

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

当我想将数据插入mysql-database时,我只希望找到关键字所在的div内的信息。

我知道我必须使用DOM,但我是domdocument场景的新手。

示例:http://crawler.tmp.remote.nl/example.php

4 个答案:

答案 0 :(得分:0)

我认为您所需的解决方案存在一些问题:

  1. HTML可能无效,您必须“修复”它才能解析它
  2. 信息可能不会存储在DIV中,而是存储在TITLE,P,H1-H6,TD或其他任何内容中
  3. 关键字也可以出现在某些属性中,例如元描述或元关键字。
  4. 通常你会使用一些XPATH查询来搜索DOM树,但我真的不知道如何搜索一个节点,该节点的子节点类型为“text node”,其中包含一个特定的关键字。

    您可能需要查看Lucene,其中提供了一些搜索引擎功能。还有一些用于Lucene的HTML解析器可能能够解决您的问题。

    编辑:您可以在匹配关键字“之前”搜索下一个标记,然后搜索下一个相应的结束标记。但这实际上可能不是父DIV的结束标记。

    编辑:我发现了一个关于在代码中搜索文字的问题:How to match a text node then follow parent nodes using XPath。因此,您可能尝试将整个HTML导入SimpleXML或DOMDocument,而不是使用XPath来搜索字符串和父DIV。

答案 1 :(得分:0)

$ 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等)

答案 2 :(得分:0)

也许这会以一般方式提供帮助。代码将找到具有'id'属性和包含“keyword”的文本的所有元素,然后显示'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";
    }
}

答案 3 :(得分:0)

我用以下方法解决了问题:

    $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 />";
    }