【问题标题】:Screen Scraping屏幕抓取
【发布时间】:2011-02-20 06:29:03
【问题描述】:

您好,我正在尝试在我的网站上实现屏幕抓取场景,并且到目前为止设置了以下内容。我最终要做的是替换 $results 变量中具有“ResultsDetails.aspx?”的所有链接。到“results-scrape-details/”然后再次输出。谁能指出我正确的方向?

<?php 
$url = "http://mysite:90/Testing/label/stuff/ResultsIndex.aspx";
$raw = file_get_contents($url);
$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$content = str_replace($newlines, "", html_entity_decode($raw));
$start = strpos($content,"<div id='pageBack'");
$end = strpos($content,'</body>',$start) + 6;
$results = substr($content,$start,$end-$start);
$pattern = 'ResultsDetails.aspx?';
$replacement = 'results-scrape-details/';
preg_replace($pattern, $replacement, $results);
echo $results;

【问题讨论】:

    标签: php screen screen-scraping


    【解决方案1】:

    使用像 PHP Simple HTML DOM 这样的 DOM 工具。有了它,您可以使用 Jqueryish 语法找到您要查找的所有链接。

    // Create DOM object from HTML source
    $dom = file_get_html('http://www.domain.com/path/to/page');
    // Iterate all matching links
    foreach ($dom->find('a[href^=ResultsDetails.aspx') as $node) {
        // Replace href attribute value
        $node->href = 'results-scrape-detail/';
    }
    // Output modified DOM
    echo $dom->outertext;
    

    【讨论】:

    • 比我快——删除我的答案。虽然我会注意到他可能想要使用-&gt;find('a[href*=...');,这意味着“包含”而不是“开始于”,具体取决于该字符串在 HREF 值中出现的位置。此外,没有 ->outerhtml 方法,只有外部文本(我在您的示例中更正了)
    • 这只会用硬编码的无前缀的相对 URL 替换链接。
    • 完善算法取决于最终用户,就像任何家庭作业一样。我只是提供机制。
    【解决方案2】:

    ? char 在正则表达式中具有特殊含义 - 要么转义它并使用相同的代码,要么用 str_ireplace() 替换 preg_replace(我推荐后一种方法,因为它也更有效)。

    (真的应该调用 html_entity_decode 吗?)

    C.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2011-06-03
      • 2014-07-29
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多