PHP странная проблема зацикливания - PullRequest
1 голос
/ 28 июня 2011

Извините за длинный код, я действительно его теряю.

Этот код должен получать список URL-адресов через POST, в текстовой области с перерывами между каждым URL-адресом.Сценарий должен загрузить каждый URL, пройти через HTML и взять несколько ссылок, затем перейти по этим ссылкам, получить некоторые данные и вывести их на экран.если я запускаю getDetails() только один раз, поскольку я получаю только один набор результатов.

Я несколько раз проверял, принимает ли цикл foreach каждый URL отдельно, и эта частьработает

Может кто-нибудь заметит проблему?

require_once('simple_html_dom.php');

function getDetails($html) {
    $dom = new simple_html_dom;
    $dom->load($html);
    $title = $dom->find('h1', 0)->find('a', 0);
    foreach($dom->find('span[style="color:#333333"]') as $element) {
       $address = $element->innertext;
    }
    $address = str_replace("<br>"," ",$address);
    $address = str_replace(","," ",$address);
    $title->innertext = str_replace(","," ",$title->innertext);

    if ($address == "") {
        $exp = explode("<strong><strong>",$html);
        $exp2 = explode("</strong>",$exp[1]);
        $address = $exp2[0];
    }

    echo $title->innertext . "," . $address . "<br>";
}

function getHtml($Url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/");
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

function getdd($u) {
    $html = getHtml($u);
    $dom = new simple_html_dom;
    $dom->load($html);
    foreach($dom->find('a') as $element) {
       if (strstr($element->href,"display_one.asp")) {
            $durls[] = $element->href;
       }
    } 
    return $durls;
}

if (isset($_POST['url'])) {
    $urls = explode("\n",$_POST['url']);
    foreach ($urls as $u) {
        $durls2 = getdd($u);
        $durls2 = array_unique($durls2);
        foreach ($durls2 as $durl) {
            $d = getHtml("http://www.example.co.il/" . $durl);
            getDetails($d);
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Когда вы используете DOMDocument для html, вы загружаете его с помощью $dom->loadHTMLFile() или $dom->loadHTML(), вам также следует позвонить libxml_use_internal_errors(true), прежде чем он не потерпит крах из-за неправильно отформатированного html.

0 голосов
/ 28 июня 2011

Вы только назначаете последний элемент в цикле, похоже. Вам нужно будет объединить. Что-то вроде $address .= $element->innertext; внутри цикла (обратите внимание на. = Вместо =).

edit: если я не ошибаюсь, что он должен делать. Я думаю, что я мог сосредоточиться на неправильной части кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...