我需要数据的外部页面。它可以通过餐厅订单获得某种类型的清单。现在这个页面有表...每个表都有一个类告诉它的表格,例如“交付订单”
在这些tabes中有行和tds ..我需要每行的td值为我的数据数组......
所以我做什么..我做一个xpath查询gettin表的内容与类状态厨房。这有效...但是现在我需要这个表中的所有行和tds ...由类分隔,例如<td class="orderode">0000</td>
我需要在我的数组中作为'ordercode' => val
..所以我在内部做了另一个循环循环使用另一个xpath查询
但是现在我看到所有订单代码不仅仅是厨房...因为它再次解析整个html ...我只想对父foreach结果或其他东西进行查询..我怎么能这样做? / p>
$result = array();
$html = $sc->login(); //curl result
$dom = new DOMDocument;
$dom->loadHTML($html);
$xPath = new DOMXPath($dom);
$classname = "order-link wide status-kitchen";
$td = $xPath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
foreach($td as $val){
$classname = "code order-code";
$td2 = $xPath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
foreach($td2 as $v){
$result[] = $v->nodeValue;
}
}
print_r($result);
HTML外观的示例:
/ *厨房订单清单* /
<table class="order-list">
<tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> // REPEAT
<tr>
<td class="time">17:43</td>
<td class="time-delivery ">
18:45 </td>
<td class="code order-code">00000</td>
<td>address data</td>
<td class="distance">
</td>
<td class="amount">€ 29,75</td>
</tr>
</tbody>
<tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
<tr>
<td class="time">17:43</td>
<td class="time-delivery ">
18:45 </td>
<td class="code order-code">00000</td>
<td>address data</td>
<td class="distance">
</td>
<td class="amount">€ 29,75</td>
</tr>
</tbody>
</table>
/*order list deliverd */
<table class="order-list">
<tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
<tr>
<td class="time">17:43</td>
<td class="time-delivery ">
18:45 </td>
<td class="code order-code">00000</td>
<td>address data</td>
<td class="distance">
</td>
<td class="amount">€ 29,75</td>
</tr>
</tbody>
<tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
<tr>
<td class="time">17:43</td>
<td class="time-delivery ">
18:45 </td>
<td class="code order-code">00000</td>
<td>address data</td>
<td class="distance">
</td>
<td class="amount">€ 29,75</td>
</tr>
</tbody>
答案 0 :(得分:1)
要从DOM中的给定节点开始运行第二个xpath查询,请使用.
开始查询,并将上下文节点作为第二个参数传递给query()
。
$td2 = $xPath->query(".//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]", $val);
答案 1 :(得分:-2)
您希望避免使用HTML DOM和类似的HTML抓取工具,因为它们不会删除某些类型的无效HTML,尤其是表格存在问题。
获取所有trs:
preg_match_all( '~<tr.*?>(.*?)<\/tr>~is', $page, $trs );
foreach( $trs as $tr )
{
preg_match_all( '~<td.*?>(.*?)<\/td>~is', $tr, $tds );
print_r( $tds );
}
这将获取所有TR元素,包含任何属性或无属性以及任何内部HTML或无内部HTML。 i标志表示不区分大小写,s标志表示它将包含\ n in。火柴。对于TD来说也一样。
看到我在这里发布的同样的事情:
虽然我多年没有用过这个,但我不确定这个功能。我只是单独使用reg ex。
更新:使用上述类:
$c = new HTMLQuery( $html );
$tbs = $c->getElements( 'tbody', 'class', 'order-link wide status-kitchen' );
print_r( $tbs );
// you could then call a new HTMLQuery and query trs, etc., or:
foreach( $tbs as $tb )
{
preg_match_all( '~<tr.*?>(.*?)<\/tr>~is', $tb, $trs );
foreach( $trs as $tr )
{
preg_match_all( '~<td.*?>(.*?)<\/td>~is', $tr, $tds );
print_r( $tds );
}
}