如何从 table 中提取在 class 中有数字的数据?
How to extract data from table which have number in class?
在下面的代码中,我编写了从 table
中提取数据的代码
使用 xpath 我得到了名称,但价格 class 属性是数字增加
<td id="f_4142_39_pr"></td> , <td id="f_4139_39_pr"></td> , <td id="f_4136_39_pr"></td> ,...
我无法获取所有价格
以下是قیمت روز گوشی موبایل我的代码
$produsttitleQuery = $xpath->query("//tr/td[@class='entry entryltr'] ");
$produstpriceQuery = $xpath->query("//tr/td[@class='f_4136_39_pr']");
$data = array();
$data = array();
for ($x=0; $x<20; $x++){
$data[$x]['title'] = $produsttitleQuery->item($x)->nodeValue;
$data[$x]['price'] = $produstpriceQuery->item($x)->nodeValue;
}
echo '<pre>';
print_r($data);
--
Array
(
[0] => Array
(
[title] => Dell 5537
[price] =>
)
[1] => Array
(
[title] => Dell 3521
[price] =>
)
,...
问题 2:我想在顶部代码中使用 foreach 循环而不是 for..
如果 PHP 支持 XPath 2.0,您可以使用 matches()
函数,但 PHP 仅支持 XPath 1.0,因此此处不提供选项。在您的情况下,HTML 似乎相当固定,因此您可以通过将其作为产品标题 td
元素的兄弟(parent 的 child)来获取价格,使用索引。
有时在此页面上,价格包含在一个跨度内,我也在下面说明了这一点。该代码不是防弹的,但我希望它能有所帮助。
$url = 'http://www.iranjib.ir/showgroup/95/'
. '%D9%82%DB%8C%D9%85%D8%AA-%D8%B1%D9%88%D8%B2-'
. '%D9%84%D9%BE-%D8%AA%D8%A7%D9%BE/';
$dom = new DOMDocument();
@$dom->loadHTMLFile($url); // Suppress loads of warnings
$xpath = new DOMXPath($dom);
// Loop product title nodes
$titleQuery = $xpath->query("//tr/td[@class='entry entryltr']");
for ($i = 0; $i < $titleQuery->length; $i++) {
$titleNode = $titleQuery->item($i);
$priceNode = $titleNode->parentNode->childNodes->item(16); // Price sibling
$itemData['title'] = trim($titleNode->nodeValue);
if ($priceNode) {
// If price is within a span
$lastPriceSpanNodeQuery = $xpath->query(
".//span[@class='lastprice']", $priceNode
);
if ($lastPriceSpanNodeQuery->length) {
// Get price from td/span
$priceNode = $lastPriceSpanNodeQuery->item(0);
}
$itemData['price'] = trim($priceNode->nodeValue);
}
$data[] = $itemData;
}
print_r($data);
输出:
Array
(
[0] => Array
(
[title] => DELL XPS L502 X
[price] => 0
)
[1] => Array
(
[title] => Dell 5537
[price] => 2,048,874
)
...
[119] => Array
(
[title] => Lenovo G510
[price] => 2,335,392
)
)
在下面的代码中,我编写了从 table
中提取数据的代码使用 xpath 我得到了名称,但价格 class 属性是数字增加
<td id="f_4142_39_pr"></td> , <td id="f_4139_39_pr"></td> , <td id="f_4136_39_pr"></td> ,...
我无法获取所有价格
以下是قیمت روز گوشی موبایل我的代码
$produsttitleQuery = $xpath->query("//tr/td[@class='entry entryltr'] ");
$produstpriceQuery = $xpath->query("//tr/td[@class='f_4136_39_pr']");
$data = array();
$data = array();
for ($x=0; $x<20; $x++){
$data[$x]['title'] = $produsttitleQuery->item($x)->nodeValue;
$data[$x]['price'] = $produstpriceQuery->item($x)->nodeValue;
}
echo '<pre>';
print_r($data);
--
Array
(
[0] => Array
(
[title] => Dell 5537
[price] =>
)
[1] => Array
(
[title] => Dell 3521
[price] =>
)
,...
问题 2:我想在顶部代码中使用 foreach 循环而不是 for..
如果 PHP 支持 XPath 2.0,您可以使用 matches()
函数,但 PHP 仅支持 XPath 1.0,因此此处不提供选项。在您的情况下,HTML 似乎相当固定,因此您可以通过将其作为产品标题 td
元素的兄弟(parent 的 child)来获取价格,使用索引。
有时在此页面上,价格包含在一个跨度内,我也在下面说明了这一点。该代码不是防弹的,但我希望它能有所帮助。
$url = 'http://www.iranjib.ir/showgroup/95/'
. '%D9%82%DB%8C%D9%85%D8%AA-%D8%B1%D9%88%D8%B2-'
. '%D9%84%D9%BE-%D8%AA%D8%A7%D9%BE/';
$dom = new DOMDocument();
@$dom->loadHTMLFile($url); // Suppress loads of warnings
$xpath = new DOMXPath($dom);
// Loop product title nodes
$titleQuery = $xpath->query("//tr/td[@class='entry entryltr']");
for ($i = 0; $i < $titleQuery->length; $i++) {
$titleNode = $titleQuery->item($i);
$priceNode = $titleNode->parentNode->childNodes->item(16); // Price sibling
$itemData['title'] = trim($titleNode->nodeValue);
if ($priceNode) {
// If price is within a span
$lastPriceSpanNodeQuery = $xpath->query(
".//span[@class='lastprice']", $priceNode
);
if ($lastPriceSpanNodeQuery->length) {
// Get price from td/span
$priceNode = $lastPriceSpanNodeQuery->item(0);
}
$itemData['price'] = trim($priceNode->nodeValue);
}
$data[] = $itemData;
}
print_r($data);
输出:
Array
(
[0] => Array
(
[title] => DELL XPS L502 X
[price] => 0
)
[1] => Array
(
[title] => Dell 5537
[price] => 2,048,874
)
...
[119] => Array
(
[title] => Lenovo G510
[price] => 2,335,392
)
)