PHP - копание дальше в запросе Xpath

0

Я пытался узнать, как использовать типы запросов 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
                    }


            }
    }  

Вот мой пример

  • 0
    Удален мой комментарий, так как @Duccydake имеет гораздо больше смысла, чем я;)
Теги:
xpath

1 ответ

2
Лучший ответ

Попробуй это:

$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

Надеюсь, это понятно (и полезно конечно) и извините за ошибки, английский не мой язык.

  • 0
    OMG так здорово, спасибо Duffydake. Я пытался использовать следующий брат, но у меня были проблемы. У меня было это первоначально перечислено в stackoverflow.com/questions/27086891/…, потому что это продолжало цикл по городам. Недостающая часть, что является частью ul [1]. Я даже подключил это к оригинальному сообщению, и теперь оно работает. Можете ли вы объяснить эту часть немного больше? Я знаю, что нужно получить первый, но зачем это нужно? Вы можете сделать запрос X path в Google с $ x ("") в потреблении, но не знаете, как использовать в нем слишком много подписок.
  • 0
    да [1] для выбора только первого, в противном случае вы выберете все остальные, я не знаю, почему именно для меня это не должно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню