Я пытался узнать, как использовать типы запросов Xpath из этого видео: https://www.youtube.com/watch?v=632ql93H90g
Хотя я начал немного понимать все, что я хотел бы взять немного дальше, и попытаться извлечь извлеченный код цикла, чтобы вытащить вложенные элементы и затем классифицировать их. Я просто использовал Craigslist в качестве примера, потому что они запустили его в видео и указали на странице "сайты".
Мне пришлось переписать это, потому что перед ним был бесконечный цикл. Теперь, если ANYONE знает лучший способ написать это, мне понравится вход, но это то, что у меня есть.
Все, что я пытался сделать, это получить мои результаты в следующем формате....
Страна - штат - ГородNameTEXT - CityNameHREF
конечно cityNamehref= thelink к городу.
Теперь прямо сейчас у меня просто есть print_r результаты внутреннего, в котором есть фактический город, указанный с момента от Craigslist.
<h1>CountryName</h1>
<div class="colmask">
<div>
<h4>StateName</h4>
<ul>
<li>
<a href="CityNameHREF">CityName</a>
</li>
<li>
<a href="CityNameHREF">CityName</a>
</li>
<li>
<a href="CityNameHREF">CityName</a>
</li>
<li>
<a href="CityNameHREF">CityName</a>
</li>
</ul>
</div>
</div>
Как вы можете видеть, что его вложенные очень сложные внутри. Я пробовал буквально в течение 12 часов, чтобы попытаться заставить это работать. Это ближайший я получил, где он будет отображать UL nodeValues, являющиеся фактическими названиями городов. Но у меня нет CLUE, как правильно отобразить эти города в формате, указанном выше.
Теперь о коде, который у меня есть...
$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url);
$doc = new DOMDocument();
libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors
$xpath = new DOMXpath($doc);
foreach ($xpath->query('//h1') as $e)
{
$country = $e->nodeValue;
$list = array();
foreach ($xpath->query('//div[@class="colmask"]/div', $e) as $li)
{
$state = $li->nodeValue;
echo "<pre>";
$result = $xpath->query('//div[@class="colmask"]/div/ul', $e);
for ($i = 0; $i <= 10; $i++) //10 instead so it doesn't lag out
{
print_r($result->item($i)); //Displays the UL nodeValue
}
}
}
Попробуй это:
$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url);
$doc = new DOMDocument();
libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors
$xpath = new DOMXpath($doc);
foreach ($xpath->query('//h1') as $e) {
$country = trim($e->textContent);
foreach ($xpath->query('following-sibling::div[1]//h4', $e) as $h4) {
$state = trim($h4->textContent);
foreach ($xpath->query('following-sibling::ul[1]//li/a', $h4) as $a) {
$town = $a->textContent;
$attributeNodeMap = $a->attributes;
$nodeAttribute = $attributeNodeMap->getNamedItem("href");
$href = trim($nodeAttribute->nodeValue);
echo "$country - $state - $town - $href<br>";
}
}
}
РЕДАКТИРОВАТЬ
Так, как я это сделал.
Прежде всего, я использую firefox с firebug и firepath (думаю, вы можете найти похожие инструменты для другого веб-браузера).
Эти инструменты позволяют мне попробовать Xpath без написания PHP-кода.
С firebug вы можете увидеть дерево DOM, которое действительно полезно знать, что вы можете достичь, и затем попробовать Xpath с firepath
Чтобы начать, я выбрал все H1- узлы //h1
в документе, а затем вам нужно получить все H4 для каждого H1, чтобы получить состояние, но, к сожалению, узел H4 не является дочерним узлом H1, поэтому вам нужно найти другой способ его достижения, если вы хотите начать с узла H1.
Если вы посмотрите на дерево DOM, вы увидите, что div (который содержит узел H4) является одним из следующих родственников узла H1, поэтому выберите его following-sibling::div[1]
(это div <div class="colmask">
для текущего узла h1).
Нам нужны все узлы H4 //h4
тогда у нас есть following-sibling::div[1]//h4
Теперь мы делаем то же самое для <a href...>
для каждого H4, поэтому мы выбираем все узлы A во всех узлах LI, которые находятся в следующем sibling UL из H4 following-sibling::ul[1]//li/a
Надеюсь, это понятно (и полезно конечно) и извините за ошибки, английский не мой язык.
[1]
для выбора только первого, в противном случае вы выберете все остальные, я не знаю, почему именно для меня это не должно.