Найдите тег <p>(абзац) с определенным классом и извлеките его содержимое с помощью PHP Simple HTML DOM Parser - PullRequest
0 голосов
/ 07 мая 2018

Я хочу найти тег p с классом ft04 между опытом работы и ОБРАЗОВАНИЕМ И ОБУЧЕНИЕМ и извлечь текст класса, который содержит название компании из данного html

<p class = "ft00">Introduction</p>
<p class = "ft00">John Smith</p>
<p class = "ft02">Email:</p>
<p class = "ft02">Phone Number:</p>
<p class = "ft00">John@gmail.com</p>
<p class = "ft00">Work Experience</p>
<p class = "ft00">27 July 2017</p>
<p class = "ft04">ABC Company</p>
<p class = "ft00">19 May 2018</p>
<p class ="ft04">XYZ Company</p>
<p class = "ft00">EDUCATION AND TRAINING</p>

Насколько я мог получить, это извлечь все данные между опытом работы и ОБРАЗОВАНИЕМ И ОБУЧЕНИЕМ, и это работает должным образом, а код приведен ниже: -

$fexp = $html->find('p[plaintext^=Work Experience]');
$items = array();
 foreach ($fexp as $keye) {

    while ( $keye->nextSibling() ) {
        if ( $keye->nextSibling() == TRUE ) {

         $keye = $keye->nextSibling();
            $varce = $keye->plaintext;



        }
        if ( trim($varce) == "EDUCATION AND TRAINING" ){
            break;
        }
        //$test[] = $collection;
       $items[] = $varce;
        // echo $varce;

}
}
var_dump($items);

Я близко, но не могу найти решение, любая помощь будет признательна, спасибо: -)

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете проверить класс с помощью:

$keye->getAttribute("class") === "ft04"

и вы можете установить nextSibling() в операторе while, чтобы сократить код:

while ($keye = $keye->nextSibling()) {

При циклическом просмотре братьев и сестер вы проверяете имя класса ft04 и добавляете plaintext в свой массив $items.

Вы можете обновить свой код до:

$fexp = $html->find('p[plaintext^=Work Experience]');
$items = array();
foreach ($fexp as $keye) {
    while ($keye = $keye->nextSibling()) {
        if ($keye->plaintext === "EDUCATION AND TRAINING") {
            break;
        }
        if($keye->getAttribute("class") === "ft04") {
            $items[] = $keye->plaintext;
        }
    }
}
var_dump($items);

Это даст вам:

array(2) {
  [0]=>
  string(11) "ABC Company"
  [1]=>
  string(11) "XYZ Company"
}
0 голосов
/ 07 мая 2018

Вот рабочий код:)

$html = '<p class = "ft00">Introduction</p>
<p class = "ft00">John Smith</p>
<p class = "ft02">Email:</p>
<p class = "ft02">Phone Number:</p>
<p class = "ft00">John@gmail.com</p>
<p class = "ft00">Work Experience</p>
<p class = "ft00">27 July 2017</p>
<p class = "ft04">ABC Company</p>
<p class = "ft00">19 May 2018</p>
<p class ="ft04">XYZ Company</p>
<p class = "ft00">EDUCATION AND TRAINING</p>';

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

$items = array();

foreach ($doc->getElementsByTagName('p') as $p) {
    if (strtolower(trim($p->nodeValue)) == 'work experience') {
        $found = true;
    }
    if (isset($found) && strtolower(trim($p->getAttribute('class'))) == 'ft04') {
        $items[] = $p->nodeValue;
    }
    if (strtolower(trim($p->nodeValue)) == 'education and training') {
        break;
    }
}

print_r($items);

Выход

Array
(
    [0] => ABC Company
    [1] => XYZ Company
)

Надеюсь, это поможет

...