@tltary

Как с помощью xpath спарсить элемент?

Есть такой код

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "адрес сайта");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);
 
$domDocument = new DOMDocument();
@$domDocument->loadHTML($content);
 
$xPath = new DOMXPath($domDocument);
$pElements = $xPath->query('//html/body/div[1]/div[3]/div/div/table/tbody/tr[15]/td');
$pElements2 = $xPath->query('//html/body/div[1]/div[3]/div/div/table/tbody/tr[18]/td');
$pElements3 = $xPath->query('//html/body/div[1]/div[3]/div/div/table/tbody/tr[3]/td');

 
if ($pElements->length > 0) {
    foreach ($pElements as $pElement) {
        $result[] = $pElement->nodeValue."\n";
    }
}

if ($pElements2->length > 0) {
    foreach ($pElements2 as $pElement) {
        $result2[] = $pElement->nodeValue."\n";
    }
}
if ($pElements3->length > 0) {
    foreach ($pElements3 as $pElement) {
        $result3[] = $pElement->nodeValue."\n";
    }
}
 
 
file_put_contents("article.txt", $result);
file_put_contents("article1.txt", $result2);
file_put_contents("article2.txt", $result3);


Но не могу понять как работает xpath, сколько не пробую ничего не происходит и данные не парсятся
Также надо что бы брался не один url а массив

В какую сторону лучше посмотреть?
Знаю что код не очень, но нужен быстрый и просто вариант спарсить определенные данные
  • Вопрос задан
  • 526 просмотров
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
если видишь y/div[1]/ в xpath - бей по рукам пока не научатся писать валидные выражения

в целом css селекторы проще и зачастую их хватает в 80% случаев
Ответ написан
Комментировать
glebovgin
@glebovgin
Full Stack Web Developer
1. Убедитесь, что точно получаете документ. echo $content; поможет.
2. Попробуйте с помощью xpath взять какой-то простой элемент, например title
$el = $xPath->query('//title');
echo $el->item(0)->nodeValue;

3. Сокращайте xpath-запросы до более понятных и простых. Например, если нужная вам table имеет класс или id, то обращайтесь проще
$el = $xPath->query('//table[@class="table_class"]/tr[15]/td');

Почти всегда можно найти способ добраться до элемента быстрее, чем идти от корневого элемента //html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы