2013-11-12 2 views
1

Я пытаюсь получить доступ к HTML-странице и получить определенное число из div, который генерируется динамически.Разбор HTML для определенной части div

<span itemprop="average" content="XX"></span> 

Я хочу получить «XX» в качестве переменной, которая будет отличаться для каждой страницы.

Это делается с помощью синтаксического анализа HTML или простого preg_replace?

Благодаря

+2

Не каждый элемент HTML называется 'div'. Это 'span'. – powerbuoy

ответ

1

Не следует использовать Regex для разбора HTML. Лучший способ - использовать парсер. PHP5 поставляется с некоторыми пропитанными, такими как DOMDocument и DOMXPath.

Вот пример, используя два для завершения:

$html = '<html><head></head><body> 
<span itemprop="average" content="XX">some text</span> 
<span itemprop="not_average">other text</span> 
</body></html>'; 


$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

$nodelist = $xpath->query("//span[@itemprop='average']"); 

foreach ($nodelist as $node){ 
    print $node->getAttribute('content')."<br>"; 
} 

только «поймать» в том, что DOMDocument анализатор является гораздо более ограничительным, чем парсер браузеров и «hickup» на некоторых страницах, извлеченные из переплетения.

+0

Это и многие другие! См. SO Question [HTML Pharsers в PHP] (http://stackoverflow.com/a/3577662/292735). Если вы знаете структуру, XPath сможет получить ваше значение почти в одной строке кода. – MackieeE

+1

Я предлагаю использовать DOMXpath :: evaluation() не DOMXpath :: query(). Evaluate может возвращать скаляры, а не только списки узлов. Это позволяет получить значение в виде строки с одной строкой XPath: «string (// span [@ itemprop = 'average]]/@ content) – ThW

2

Если вы только начинаете соскабливать, я бы порекомендовал Imacros или import.io. Я начал использовать их, когда начинал свои скребущие задачи, и начал понимать, как все это работает немного лучше. Также очень полезно использовать cUrl с Php при очистке, это будет ваш лучший друг

0

Использование DOM - это, как правило, лучшая идея для подобных вещей.

$html = <<<HTML 
<html> 
    <body> 
    <span itemprop="average" content="XX"></span> 
    </body> 
</html> 
HTML; 

libxml_use_internal_errors(TRUE); 

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$xpath = new DOMXpath($dom); 

$content = $xpath->evaluate('string(//span[@itemprop = "average"]/@content)'); 

var_dump($content); 

libxml_use_internal_errors() отключает вывод ошибки для плохого html. Вы можете использовать libxml_get_errors() для их чтения и libxml_clear_errors(), чтобы очистить текущий буфер ошибок.

Затем создается DOMDocument и загружается html. DOMDocument :: loadHtmlFile() позволит загрузить его из файла или URL-адреса.

После загрузки документа вы можете создать объект DOMXpath для загруженного документа, он позволяет запрашивать элементы из него.

DOMXpath :: evaluation() позволяет запрашивать списки узлов и скаляры из документа. Строковый тип в выражениях xpath передает узел атрибута в строку и возвращает значение. Без typecast результатом будет DOMNodelist, содержащий любое количество узлов DOMAttribute. При этом результатом является значение атрибута или пустая строка.

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

  • Нет связанных вопросов^_^