2012-03-16 2 views
1

Итак, я пишу приложение на PHP для проверки своих сайтов, если все ссылки действительны, поэтому я могу их обновить, если потребуется.Извлечение определенных частей HTML из 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++)

ответ

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; 
} 
+0

хорошо, я определенно буду давать этот снимок, нужно искать несколько вещей, но я думаю, что теперь не будет проблемой, когда я вижу, что мне нужно искать –

+0

DOMDocument и DOMXPath - это довольно удивительно и очень милостиво даже для плохого/сломанного HTML. Есть грузы, которые вы можете сделать с ним :) –

+1

да, я только начал экспериментировать с DOMXPath, и это похоже на забаву. Однако мне понадобится более глубокая документация, чем тот, который представлен на php.net, примеры не столь информативны, как я бы хотел, чтобы они были. –

0

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

+0

мне нужно что-то более изящное то, что вышеуказанное решение по sonassi предложений (как я вижу) более элегантное решение проблемы, но спасибо за попытку :) –

Смежные вопросы