2014-10-19 2 views
0

Я пытаюсь написать php-скрипт для обхода веб-сайта и сохранения некоторых элементов в базе данных.php - Простой HTML-элемент - элементы между другими элементами

Вот моя проблема: веб-страница написана так:

<h2>The title 1</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p> 

<h2>The title 2</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p> 

<p class="one_class"> Some different text </p> 
<p> Some other interesting text </p> 

<h2>The title 3</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p> 

Я хочу, чтобы получить только h2 и р с интересным текстом, а не р класс = «one_class».

Я попробовал этот PHP код:

<?php 
$numberP = 0; 
foreach($html->find('p') as $p) 
{ 
    $pIsOneClass = PIsOneClass($html, $p); 

    if($pIsOneClass == false) 
    { 
     echo $p->outertext; 
       $h2 = $html->find("h2", $numberP); 
       echo $h2->outertext; 
       $numberP++; 
     } 

} 
?> 

функция PIsOneClass ($ HTML, $ р):

<?php 
function PIsOneClass($html, $p) 
{ 
foreach($html->find("p.one_class") as $p_one_class) 
    { 
     if($p == $p_one_class) 
     { 
      return true; 
     }   
    } 
    return false; 
} 
?> 

Это не работает, я понимаю, почему, но я не знать, как его решить.

Как мы можем сказать: «Я хочу, чтобы каждый p без класса находился между двумя h2?»

Thx много!

+0

Если они все 'p.one_class', почему бы не искать эти теги' p' и удалить их перед выводом результата для сохранения? –

+0

Но как я могу заказать h2 и p? С помощью этого сценария он печатает h2 p h2 p h2 p, но я хочу что-то вроде h2 p p h2 p –

ответ

0

Эта задача проще с XPath, так как вы очищаете более одного элемента и хотите сохранить источник в порядке. Вы можете использовать библиотеку DOM в PHP, который включает в себя DOMXPath, чтобы найти и отфильтровать элементы, которые вы хотите:

$html = '<h2>The title 1</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p> 

<h2>The title 2</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p> 

<p class="one_class"> Some different text </p> 
<p> Some other interesting text </p> 

<h2>The title 3</h2> 
<p class="one_class"> Some text </p> 
<p> Some interesting text </p>'; 

# create a new DOM document and load the html 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
# create a new DOMXPath object 
$xp = new DOMXPath($dom); 

# search for all h2 elements and all p elements that do not have the class 'one_class' 
$interest = $xp->query('//h2 | //p[not(@class="one_class")]'); 

# iterate through the array of search results (h2 and p elements), printing out node 
# names and values 
foreach ($interest as $i) { 
    echo "node " . $i->nodeName . ", value: " . $i->nodeValue . PHP_EOL; 
} 

Выход:

node h2, value: The title 1 
node p, value: Some interesting text 
node h2, value: The title 2 
node p, value: Some interesting text 
node p, value: Some other interesting text 
node h2, value: The title 3 
node p, value: Some interesting text 

Как вы можете видеть, текст источника остается в порядке, и это легко устранить узлы, которых вы не хотите.

+0

Спасибо, я не знал, что существует. Возможно ли использовать Simple Html Dom одновременно или это бесполезно? –

+0

Вы не можете выполнять операции XPath с помощью простого HTML DOM, но вы можете выводить HTML из DOMDocument, а затем читать его с помощью SHD. Однако вы должны иметь возможность делать все, что хотите, с DOM - это очень полная библиотека для обработки XML. [Вот руководство] (http://php.net/manual/en/book.dom.php). –

0

Из simpleHTML dom manual

[attribute=value] 

Соответствует элементам, которые имеют указанный атрибут с определенным значением. или

[!attribute] 

Матчи элементы, которые не имеют указанный атрибут.

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