LINUX.ORG.RU

php. getElementsByTagName. указать родителя элемента.

 


0

1

К примеру, есть такой html кусок:

<a href="http://somedomain.s//file.jpg.html" class="postLink"><var class="postImg" title="http://1.somedomain.s/foo.jpeg">&#10;</var></a>

Указание элемента напрямую:
$urls = $doc->getElementsByTagName("a");
Нужно: указать элемент, находящийся в теге «a», не прибегая к прямому указанию. нужно натравить php на тег «var» и, что бы отталкиваясь от такого тега, программа поднялась на уровень выше. К родителю, кем и будет являться тег «a».
Идея в том, что не все блоки «a» могут иметь потомков «var». Если указывать тег «a» напрямую, то программа захватит все теги «a» даже, где нет тегов-потомков «var», а значения классов могут быть одинаковыми. Что у var. Что у a.
Вопрос: Есть ли какая-то функция, или команда в php, которая бы умела это?

★★★

Слушай ну за это время ты мог бы освоить и http://php.net/manual/ru/function.preg-match-all.php и http://php.net/manual/ru/book.dom.php

Но если ты совсем ленив возьми уже http://simplehtmldom.sourceforge.net/

Без ключей типа ID или CLASS либо каких других уникальных данных ты всё равно будешь вынужден собрать все ссылки и разобрать код рядом с ними.

Не ищи легких путей освой уже DOM.

VictimOfLoveToLinux
()

Возьми теги «a», дальше пропусти те, которые не содержат «var». Что такого ужасного и недопустимого в таком подходе?

sholom
()
Ответ на: комментарий от sholom

За день не освою точно. А в следующие выходные работать за праздники.
ну да фик с ним. Летом будет недели две. закрыто. Мои извинения.

ESTAF ★★★
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux

А что означает константа «XML_ELEMENT_NODE»?
На http://php.net/manual/ru/book.dom.php этот момент упоминается лишь один раз и описания оной - 0. По гуглу, о ней лишь упоминается, как о детали совсем других вещей. Описания то же сложно найти.

ESTAF ★★★
() автор топика
Ответ на: комментарий от deep-purple

Если схематично, то xpath->query(«/var[(ancestor::a)]»).
Вывод:

DOMNodeList Object
(
    [length] => 0
)
DOMNodeList Object
(
    [length] => 0
)
о чем этот вывод, не понятно. Читаю дальше dom, но это как иголка в стоге сена. Либо читать все подряд и вызубрить. Либо продолжать какими-то хитрыми путями искать, что означает вывод.
блин. как с марса)))

ESTAF ★★★
() автор топика
Последнее исправление: ESTAF (всего исправлений: 1)
Ответ на: комментарий от ESTAF

браво, ведь не сложно правда? зато сколько знаний получил.
там ещё child есть, дабы избежать странных вопросов в дальнейшем.

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 2)
Ответ на: комментарий от VictimOfLoveToLinux

Да. почти готово, хотя наверное и ужасно выглядит))))

<?php
//$topic = 3561;
$topic = 301952;
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->loadHtml(file_get_contents("http://rutracker.org/forum/viewtopic.php?t=$topic"));
//определение встроенных объектов
$vars = $doc->getElementsByTagName("var");
//определение внешних объектов
$xpath = new DOMXPath($doc);
$exturls = $xpath->query("//a[(descendant::var)]");
//откуда нумеровать потом файлы
$n = 0;
//
for ($i = 0; $i < $vars->length; $i++) {
	$exturl = $exturls->item($i);
	$class2 = $exturl->attributes->getNamedItem('class')->textContent;
	if (strpos($class2, 'postLink') !== false) {
		$url = $exturl->attributes->getNamedItem('href')->textContent;
		$exthtml = pathinfo($url, PATHINFO_EXTENSION);
		//exturlworking
		$doc2 = new DOMDocument;
		$doc2->loadHtml(file_get_contents($url));
		$xpath2 = new DOMXPath($doc2);
		$exturls2 = $xpath2->query("//a[(descendant::img)]");
		$exturl2 = $exturls2->item($i);
		if (strpos($url, $url) !== false) {
			$img2 = $exturl2->attributes->getNamedItem('href')->textContent;
		}
		$var = $vars->item($i);
		$class = $var->attributes->getNamedItem('class')->textContent;
		if (strpos($class, 'postImg') !== false) {
			$img = $var->attributes->getNamedItem('title')->textContent;
			$ext = pathinfo($img, PATHINFO_EXTENSION);
			//file_put_contents("{$topic}_{$n}.{$ext}", file_get_contents($img2));
			//$n++;
			//file_put_contents("{$topic}_{$n}.{$ext}", file_get_contents($img));
			//$n++;}
			$path = "{$topic}_{$n}.{$ext}";
			$fp = fopen($path, 'w');
			$ch = curl_init(range($img, $img2));
			curl_setopt($ch, CURLOPT_FILE, $fp);
			$data = curl_exec($ch);
			curl_close($ch);
			fclose($fp);
			$n++;
			///////////
			//print_r($img);
		}
	}
}

ESTAF ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.