PHP Простой синтаксический анализатор HTML DOM, находит текст внутри тегов, у которых нет ни класса, ни идентификатора


У меня есть http://www.statistics.com/index.php?page=glossary&term_id=703

Конкретно в этой части:

<b>Additive Error:</b>
<p> Additive error is the error that is added to the true value and does not 
depend on the true value itself. In other words, the result of the measurement is 
considered as a sum of the true value and the additive error:   </p> 

Я старался изо всех сил, чтобы получить текст между тегами <p> и </p>, с помощью этого:

include('simple_html_dom.php');
$url = 'http://www.statistics.com/index.php?page=glossary&term_id=703';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curl_scraped_page = curl_exec($ch);
$html = new simple_html_dom();
$html->load($curl_scraped_page);

foreach ( $html->find('b') as $e ) {
echo $e->innertext . '<br>';
}

Это дает мне:

Additive Error:
Browse Other Glossary Entries

Я попытался изменить значение foreach на: foreach ( $html->find('b p') as $e ) {

Затем foreach ( $html->find('/b p') as $e ) {

Тогда он просто продолжает давать мне только пустую страницу. Что я сделал не так? Спасибо.

Author: Fii, 2013-06-18

3 answers

Почему бы не использовать встроенное расширение DOM PHP и xpath?

libxml_use_internal_errors(true);  // <- you might needs this if that page has errors
$dom = new DomDocument();
$dom->loadHtml($curl_scraped_page);
$xpath = new DomXPath($dom);
print $xpath->evaluate('string(//p[preceding::b]/text())');
//                             ^
//  this will get you text content from <p> tags preceded by <b> tags

Если существует несколько тегов <p>, которым предшествуют теги <b>, и вы хотите получить только первый, измените запрос xpath на:

string((//p[preceding::b]/text())[1])

Чтобы получить их все в виде DOMNodeList, введите функцию string(): //p[preceding::b]/text(), а затем вы можете выполнить итерацию по списку и получить доступ к свойству textContent каждого узла...

 1
Author: nice ass, 2013-06-18 18:21:14

Если вам нужно все содержимое, которое находится внутри тегов b или p, вы можете просто сделать foreach ($html->find('b,p') as $e) { ... }.

 0
Author: Joel Hinz, 2013-06-18 17:56:27

Попробуйте это

<?php
$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.statistics.com/index.php?page=glossary&term_id=703');
$xpath = new DOMXPath($dom);

$mytext = '';
foreach($xpath->query('//font') as $font){
    $mytext =  $xpath->query('.//p', $font)->item(0)->nodeValue;
    break;
}

echo $mytext;
?>
 0
Author: Khawer Zeshan, 2013-06-18 18:47:50