【问题标题】:get div around searched keyword (file_get_contents('url')围绕搜索的关键字获取 div (file_get_contents('url')
【发布时间】:2011-04-10 05:27:37
【问题描述】:

所以我创建了一个网络爬虫,一切正常,只有一个问题。

通过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

【问题讨论】:

  • 您可以随时编辑SO上的问题,无需另开新题。没什么大不了的,但为了未来。
  • 是的,我在发帖后注意到了,soz。编辑:删除最旧的线程

标签: php html web-crawler domdocument


【解决方案1】:

$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】:

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

    1. HTML 可能无效,您必须“修复”它才能解析它
    2. 信息可能不会存储在 DIV 中,而是存储在 TITLE、P、H1-H6、TD 或其他任何内容中
    3. 关键字还可以出现在某些属性中,例如元描述或元关键字。

    通常您会使用一些 XPATH 查询在 DOM 树中搜索,但我真的不知道如何搜索具有“文本节点”类型的子节点且其中包含特定关键字的节点。

    您可能想看看Lucene,它为您提供了一些搜索引擎功能。还有一些用于 Lucene 的 HTML 解析器可能能够解决您的问题。

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

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

    【讨论】:

    • 嗯,这是我需要自己编写的任务,只需要 1 个函数:p
    • 你能给我看一个例子来导入一个 html 并在其中使用 XPath 吗?我真的不明白,也许我太笨了:(
    【解决方案3】:

    也许这会有所帮助。该代码将查找所有同时具有“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";
        }
    }
    

    【讨论】:

    • 感谢您的回答,但仍然不确定该放在哪里。我猜是在我的构造函数中?
    • 好吧,我尝试了一些方法,但仍然有很多错误。错误包含:Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]:
    【解决方案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 />";
        }
    

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 2011-06-14
      • 2018-06-11
      • 1970-01-01
      • 2012-09-30
      • 2013-05-02
      • 2011-04-01
      • 1970-01-01
      相关资源
      最近更新 更多