从PHP中提取HTML的某些部分

时间:2012-03-16 22:33:38

标签: php web-crawler html-parsing simplexml domdocument

好的,所以我正在用PHP编写应用程序以检查我的网站是否所有链接都有效,所以如果必须的话我可以更新它们。

我遇到了一个问题。我尝试使用SimpleXml和DOMDocument对象来提取标签但是当我使用示例站点运行应用程序时,如果我使用SimpleXml对象类型,我通常会遇到大量错误。

那么有没有办法扫描html文档中的href属性,这与使用SimpleXml一样简单?

    <?php
    // what I want to do is get a similar effect to the code described below:

    foreach($html->html->body->a as $link)
    {
         // store the $link into a file
         foreach($link->attributes() as $attribute=>$value);
         {
              //procedure to place the href value into a file
         }
    }
?>

所以基本上我正在寻找一种方法来执行上述操作。问题是我现在对如何使用html代码处理字符串感到困惑......

为了清楚起见,我使用以下原始方式获取html文件:

<?php
$target      = "http://www.targeturl.com";

$file_handle = fopen($target, "r");

$a = "";

while (!feof($file_handle)) $a .= fgets($file_handle, 4096);

fclose($file_handle);
?>

任何信息都会有用,以及任何其他语言替代方案,其中上述问题更加优雅地修复(python,c或c ++)

2 个答案:

答案 0 :(得分:1)

您可以使用DOMDocument::loadHTML

这是我们用于编写的HTML解析工具的一堆代码。

$target = "http://www.targeturl.com";
$result = file_get_contents($target);
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
@$dom->loadHTML($result);

$links = extractLink(getTags( $dom, 'a', ));

function extractLink( $html, $argument = 1 ) {
  $href_regex_pattern = '/<a[^>]*?href=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si';

  preg_match_all($href_regex_pattern,$html,$matches);

  if (count($matches)) {

    if (is_array($matches[$argument]) && count($matches[$argument])) {
      return $matches[$argument][0];
    }

    return $matches[1];
  } else 

function getTags( $dom, $tagName, $element = false, $children = false ) {
    $html = '';
    $domxpath = new DOMXPath($dom);

    $children = ($children) ? "/".$children : '';  
    $filtered = $domxpath->query("//$tagName" . $children);

    $i = 0;
    while( $myItem = $filtered->item($i++) ){
        $newDom = new DOMDocument;
        $newDom->formatOutput = true;        

        $node = $newDom->importNode( $myItem, true );

        $newDom->appendChild($node);
        $html[] = $newDom->saveHTML();          
    }

    if ($element !== false && isset($html[$element])) {
      return $html[$element];
    } else
      return $html;
} 

答案 1 :(得分:0)

您可以使用strpos($html, 'href=')然后解析网址。您还可以搜索<a.php