对于长代码很抱歉,我真的失去了它。
这段代码应该通过POST获得一个网址列表,在每个网址之间有分隔线的textarea中。脚本应该下载每个url,浏览html并获取一些链接,然后进入这些链接,获取一些数据并将其回显。
出于某种原因,直观地它看起来好像我只运行getDetails()
一次,因为我只得到一组结果。
我已多次检查foreach
循环是否分别取出每个网址并且该部分正常工作
有人能发现问题吗?
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);
}
}
}
答案 0 :(得分:0)
你只是在循环中指定最后一个元素,它看起来像。你需要连接。类似于循环内的$address .= $element->innertext;
(注意。=而不是=)。
编辑:除非我误解了应该做的事情。我想我可能一直专注于代码的错误部分。
答案 1 :(得分:0)
当您在html上使用DOMDocument时,请使用$dom->loadHTMLFile()
或$dom->loadHTML()
加载它,您也应该事先调用libxml_use_internal_errors(true)
,以免因格式不正确的html而崩溃。