避免box xpath和curl的header
Avoid the header of box xpath and curl
我正在编写代码以使用 xpath 和 curl 获取网络数据。
这些代码得到 ul li 包含并起作用。
但我不想header..
我写了下面的代码来避免 header 但不能
if($row->item(0)->tagName != '<ul class="graybg"><li>مدل خودرو</li> <li>مشخصات</li><li>قیمت نمایندگی</li><li>قیمت بازار آزاد</li></ul>')
完整代码。
$ch = curl_init ("http://www.pedal.ir/price/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
$page = curl_exec($ch);
$dom = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
$dom->loadHTML($page);
libxml_clear_errors();
$xpath = new DOMXpath($dom);
$data = array();
$table_rows = $xpath- >query('/html/body/div/div[1]/div/div/div/div/div/div/div[2]/ul '); // target the row (the browser rendered <tbody>, but actually it really doesnt have one)
if($table_rows->length <= 0) { // exit if not found
echo 'no table rows found';
exit;
}
foreach($table_rows as $tr) { // foreach row
$row = $tr->childNodes;
if($row->item(0)->tagName != '<ul class="graybg"><li>مدل خودرو</li> <li>مشخصات</li><li>قیمت نمایندگی</li><li>قیمت بازار آزاد</li></ul>') { // avoid headers
$data[] = array(
'moled' =>trim($row->item(0)->nodeValue),
'detail' => trim($row->item(2)->nodeValue),
'pricenama' => trim($row->item(4)->nodeValue),
'pricebaza' => trim($row->item(6)->nodeValue),
);
}
}
echo '<pre>';
print_r($data);;
您可以将谓词 [not(@class)]
添加到您的 xpath 以过滤掉具有 class
属性的 <ul>
:
/html/body/div/div[1]/div/div/div/div/div/div/div[2]/ul[not(@class)]
无论如何,绝对路径并不可靠,因为它往往会因 HTML 源的微小变化而中断。尝试基于元素的 id
或 class
构建 xpath。
作为替代方案,由于 header 具有独特的 class 来标识它,您可以将其包含在检查中:
foreach($table_rows as $tr) { // foreach row
$row = $tr->childNodes;
if($row->item(0)->parentNode->getAttribute('class') !== 'graybg') { // avoid headers
$data[] = array(
'moled' =>trim($row->item(0)->nodeValue),
'detail' => trim($row->item(2)->nodeValue),
'pricenama' => trim($row->item(4)->nodeValue),
'pricebaza' => trim($row->item(6)->nodeValue),
);
}
}
我正在编写代码以使用 xpath 和 curl 获取网络数据。
这些代码得到 ul li 包含并起作用。
但我不想header..
我写了下面的代码来避免 header 但不能
if($row->item(0)->tagName != '<ul class="graybg"><li>مدل خودرو</li> <li>مشخصات</li><li>قیمت نمایندگی</li><li>قیمت بازار آزاد</li></ul>')
完整代码。
$ch = curl_init ("http://www.pedal.ir/price/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
$page = curl_exec($ch);
$dom = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
$dom->loadHTML($page);
libxml_clear_errors();
$xpath = new DOMXpath($dom);
$data = array();
$table_rows = $xpath- >query('/html/body/div/div[1]/div/div/div/div/div/div/div[2]/ul '); // target the row (the browser rendered <tbody>, but actually it really doesnt have one)
if($table_rows->length <= 0) { // exit if not found
echo 'no table rows found';
exit;
}
foreach($table_rows as $tr) { // foreach row
$row = $tr->childNodes;
if($row->item(0)->tagName != '<ul class="graybg"><li>مدل خودرو</li> <li>مشخصات</li><li>قیمت نمایندگی</li><li>قیمت بازار آزاد</li></ul>') { // avoid headers
$data[] = array(
'moled' =>trim($row->item(0)->nodeValue),
'detail' => trim($row->item(2)->nodeValue),
'pricenama' => trim($row->item(4)->nodeValue),
'pricebaza' => trim($row->item(6)->nodeValue),
);
}
}
echo '<pre>';
print_r($data);;
您可以将谓词 [not(@class)]
添加到您的 xpath 以过滤掉具有 class
属性的 <ul>
:
/html/body/div/div[1]/div/div/div/div/div/div/div[2]/ul[not(@class)]
无论如何,绝对路径并不可靠,因为它往往会因 HTML 源的微小变化而中断。尝试基于元素的 id
或 class
构建 xpath。
作为替代方案,由于 header 具有独特的 class 来标识它,您可以将其包含在检查中:
foreach($table_rows as $tr) { // foreach row
$row = $tr->childNodes;
if($row->item(0)->parentNode->getAttribute('class') !== 'graybg') { // avoid headers
$data[] = array(
'moled' =>trim($row->item(0)->nodeValue),
'detail' => trim($row->item(2)->nodeValue),
'pricenama' => trim($row->item(4)->nodeValue),
'pricebaza' => trim($row->item(6)->nodeValue),
);
}
}