Ik wil de "url" mbv xpath uit de source trekken alleen als de "distance" == 0 (url2 in dit geval):

<li class="media">
    <div class="lm_holder">
        <a href="/----------------url1--------------"><i class="f_location"></i></a>
    </div>
    <div class="rm_holder fn_holder">
        <div class="f_num" title="bala"></div>   
    </div>
    <div class="rm_holder distance">5<br /> km</div>
    <div class="m_body">
        <h4 class="m_head"><a href="/link-2">klm</a></h4>
            <p class="description">desc2</p>
    </div>
</li>

<li class="media">
    <div class="lm_holder">
        <a href="/--------------url2-----------------"><i class="f_location"></i></a>
    </div>
    <div class="rm_holder fn_holder">
        <div class="f_num" title="bala"></div>   
    </div>
    <div class="rm_holder distance">0<br /> km</div>
    <div class="m_body">
        <h4 class="m_head"><a href="/link-2">klm</a></h4>
            <p class="description">desc2</p>
    </div>
</li>



hiervoor gebruik ik:

<?php
$dom = new DomDocument;
/* Load the HTML */
$dom->loadHTMLFile($file);
/* Create a new XPath object */
$xpath = new DomXPath($dom);
/* Query all <divs> with the class name */
// $nodes = $xpath->query("//div[@class='media']//div[@class='media-body']");
$nodes = $xpath->query("//li[@class='media']");
// $nodes = $xpath->query("//li[@class='media']//div[@class='media-body']");
/* Set HTTP response header to plain text for debugging output */
// header("Content-type: text/plain");
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */
foreach ($nodes as $i => $node) {
    echo "Node($i): ", $node->nodeValue, "\n";
}
?>

Hoe bouw ik de if distance ==0 statement hierin?

Deze kun je toch na afloop wel filteren? Sla dus eerst alle hyeperlinks op met daarbij de distances en pak daarna alle hyperlinks met distance 0? Dit lijken mij twee afzonderlijke problemen.

En als ik jou was zou ik eens kijken of er ook een webservice is voor het opvragen van whatever je nu probeert te doen want wat je nu doet (wat in feite webscraping is) is nogal bewerkelijk, foutgevoelig en werkt in de meeste gevallen niet meer als wanneer de HTML-structuur verandert.
Als ik ze beide in een array kan krijgen dan is het zo opgelost maar het probleem is dat (naar mijn weten) ze af zonderlijk worden uitgelezen. Dus eerst alle distances en daarna de urls (of welke volgorde je ook aanhoudt)
Als alle URLs een distance hebben en alles ook in dezelfde volgorde wordt uitgelezen maakt dat niet uit.

Maar dit is een omslachtige manier om data ergens uit te trekken omdat deze in plakken HTML geen betekenis heeft.

Om welke site gaat het, en heeft deze geen API of webservice?

Scrapen zou echt een laatste toevlucht moeten zijn, vaak zijn er betere / handigere oplossingen.
bijna....


foreach($html->find('li[class=media]') as $element){

//totaal aantal records
$total=count($html->find('div[class=distance_holder]'));
print "<li>total:".$total;

$item['distance']     = preg_replace("/[^0-9,.]/", "",$element->find('div.distance_holder', 0)->plaintext);
$item['media-body']    = $element->find('div.media-body h4', 0)->plaintext;
$output[] = $item;


de media-body haalt nu nog de text van de link maar ik moet de url hebben.
Wie ziet de laatste horde?

(ps. dit is simplehtmldom.sourceforge.net trouwens. Xpath is volgens mij voor xml vnl.)

[size=xsmall]Toevoeging op 17/03/2018 15:47:08:[/size]

haha


$link = $element->find('div[class=media-body] h4', 0)->innertext;


@Ariƫn, ja daar had ik naar gezocht maar kon hem niet vinden. Dus thanks voor de tip!

Reageren