Извлечение определенных частей HTML из PHP - PullRequest
1 голос
/ 17 марта 2012

Хорошо, поэтому я пишу приложение на 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 ]

1 голос
/ 17 марта 2012

Вы можете использовать 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;
} 
0 голосов
/ 17 марта 2012

Вы можете просто использовать strpos($html, 'href=') и затем проанализировать URL.Вы также можете искать <a или .php

...