Thu 5 Jan 2006 08:45:57
<?
function parse_mapquest($content_file) {
error_reporting(0);
function myHandling($errno, $errstr, $errfile, $errno){
echo "error\n";
}
set_error_handler("myHandling");
$dom = new domdocument;
@$dom->loadHTMLFile($content_file);
$xpath = new domxpath($dom);
// start address (node0), end address (node1)
$nodes = $xpath->query('//div[@id="query"]//p');
foreach($nodes as $node) {
// $node = $nodes->item(0);
$b = $node->getElementsByTagName('b')->item(0); //ฟ้อง Error บรรทัดนี้
echo trim($b->nodeValue)."\n";
$node->removeChild($b);
$span = $node->getElementsByTagName('span')->item(0); //ฟ้อง Error บรรทัดนี้
$node->removeChild($span);
echo trim($node->nodeValue)."\n";
}
// extract image url
$nodes = $xpath->query('//img[@class="map"]/@src');
$pic=trim($nodes->item(0)->nodeValue)."\n"; //ฟ้อง Error บรรทัดนี้
echo "<img src='$pic'>";
}
?>
Thu 5 Jan 2006 11:45:19
ลองเปลี่ยนเป็น get_element_by_tagname แล้วก็ยังไม่ได้ครับ มันก็ยังฟ้องเหมือนเดิมครับ พออับขึ้นเว็บมันฟ้องว่า parse error, unexpected T_OBJECT_OPERATOR ตรงไหนผิดอีกเหรอครับ
function parse_mapquest($content_file) {
error_reporting(0);
function myHandling($errno, $errstr, $errfile, $errno){
echo "error\n";
}
set_error_handler("myHandling");
$dom = new domdocument;
@$dom->loadHTMLFile($content_file);
$xpath = new domxpath($dom);
// start address (node0), end address (node1)
$nodes = $xpath->query('//div[@id="query"]//p');
foreach($nodes as $node) {
// $node = $nodes->item(0);
$tmp = $node->get_elements_by_tagname('b');//->item(0); //ฟ้อง Error บรรทัดนี้
$b = $tmp->item(0);
echo trim($b->nodeValue)."\n";
$node->removeChild($b);
$tmp = $node->getElementsByTagName('span');//->item(0); //ฟ้อง Error บรรทัดนี้
$span = $tmp->item(0);
$node->removeChild($span);
echo trim($node->nodeValue)."\n";
}
// extract image url
$nodes = $xpath->query('//img[@class="map"]/@src');
$tmp = trim($nodes->item(0)); //ฟ้อง Error บรรทัดนี้
$pic = $tmp->nodeValue."\n";
echo "<img src='$pic'>";
}
?>
ลองแก้ไขให้แล้วนะครับ ที่ error เพราะว่า PHP 4 นั้น ยังรองรับการทำงานแบบ OOP แบบเต็มที่ครับเพราะฉะนั้นการใช้ operator "->" ซ้อนกันจึงยังมีปัญหาอยู่ครับ
Thu 5 Jan 2006 16:40:28
Warning: domdocument() expects at least 1 parameter, 0 given in c:\appserv\www\jitlada_new\admin\map_graphics.php on line 14
Fatal error: Call to undefined function: loadhtmlfile() in c:\appserv\www\jitlada_new\admin\map_graphics.php on line 15
แล้วถ้าขึ้นอย่างนี้หมายความว่างัยครับ
http://esup-phpcas.sourceforge.net/api/domxml-php4-php5_8php-source.html
ลองนำไปใช้งานดูนะครับ
Fri 6 Jan 2006 09:13:11
ผมไปดูมาแล้วครับแต่มันก็ยังขึ้น error ตรงคำสั่ง loadhtmlfile() ครับแสดงว่าผมยังไม่ได้เซ้ตตจรงไหนอีกหรือป่าวครับ มันเรียกใช้งานฟังก์ชันนี้ไม่ได้อ่ะครับ
Fatal error: Call to undefined function: loadhtmlfile()
http://th.php.net/domxml
เท่าที่เช็คดูแล้ว domxml ใน php4 จะไม่มีคำสั่ง loadhtmlfile นะครับ
Fri 6 Jan 2006 16:18:29
ใช่ค่ะไปดูมาแล้วว่า loadhtmlfile ใช้ไม่ได้จิงๆด้วยครับ ถ้างั้นมีคำสั่งไหนใช้แทนกันได้บ้างครับ ผมลองใช้ domxml_open_mem กะ domxml_open_file ก็ใช้ไม่ได้อ่ะครับ เพราะว่ามันต้องใช้เป็นไฟล์ xml แต่ไฟล์ที่ใช้มันเป็น html อ่ะครับผมต้องทำยังงัยดีครับ หัวหน้าเร่งงานอยู่ช่วยผมหน่อยนะครับ
Sat 7 Jan 2006 08:10:23
ทำโปรแกรมที่ไปส่งค่าจากเว็บเราไปค้นหาข้อมูลจากเว็บอื่นแล้วดึงผลที่ได้จากเว็บอื่นมาโชว์บนเว็บตัวเองครับ ถ้าใช้ php5 ได้นะครับ แต่ server ที่อัพเค้าเป็น php4 อยู่เลยน่ะครับ
Sat 7 Jan 2006 09:40:23
ตอนนี้ลองใส่แค่นี้แล้วรันดูนะครับ
$dom = new domdocument('');
$dom = file_get_contents($content_file);
$xpath = new domxpath($dom);
มันจะขึ้น error ว่า
Fatal error: Cannot instantiate non-existent class: domxpath
ส่วน error ข้างบนนี้น่าจะไม่มีการติดตั้ง module domxpath ไว้นะครับ ยังไงลองดูใน phpinfo() อีกทีครับ
Mon 9 Jan 2006 14:49:56
ตอนนี้ไม่ติด error อะไรแล้วครับเหลือแต่ว่า เวลาจะดึงข้อมูลจากหน้าเว็บของอีกเว็บมาแสดงผลครับ จากเมื่อก่อนมันใช้คำสั่ง loadhtmlfile() แต่ว่าตอนนี้มันใช้คำสั่งนี้ไม่ได้จากที่ดูใน manual มันจะให้ใช้คำสั่ง domxml_open_file() แทนแต่ว่าคำสั่งนี้มัน open แต่ไฟล์ .xml ถ้าเป็นไฟล์ .hml มันไม่ได้ พอจะมีวิธีไหนบ้างหรือเปล่าครับที่จะสามารถดึงข้อมูลมาได้ ไปโพสต์ถามอยู๋ที่นึงเค้าแนะนำให้ใช้ fopen แต่มันต้องตัดคำเอง ถ้าเป็นแบบนี้
$nodes = $xpath->query('//div[@id="query"]//p');
มันจะตัดคำยากเพราะลองทำดูแล้วค่ามันไม่ออกตามต้องการและมีอีกที่เค้าแนะนำให้ใช้ tidyhtml และที่พี่ administrator แนะนำก็ cURL ผมก็ไม่เข้าใจว่ามันเป็นยังงัยอ่ะครับ ช่วยแนะนะผมหน่อยนะครับ
แต่เท่าที่อ่านมาตลอดเข้าใจว่าคุณกำลังต้องการทำโปรแกรม parser ใช่ไหมครับ คงต้องบอกว่าต้องทำการเขียน parser ขึ้นมาเองครับ ไม่สามารถใช้ module ช่วยได้ครับ โดยพยายามใช้ ereg() ในการเปรียบเทียบแทนการใช้ query ด้านบนครับ (เคยหาเพื่อทำให้ลูกค้าเหมือนกันครับแต่ไม่มีครับสุดท้ายต้องทำด้วยตัวเองครับ)
Tue 10 Jan 2006 11:23:43
ช่วยแนะนำหน่อยสิครับว่าต้องเขียนประมาณไหน คำสั่ง ereg() อ่ะครับ ผมลองเขียนแล้วมันส่งค่ากลับมาเป็น 1 แล้วไม่รู้ว่าจะใช้คำสั่งไหนต่อดีพวก str ทั้งหลายอ่ะครับ
**เข้าใจว่าเป็นการ parse ข้อมูลจากเว็บอื่น ซึ่งถ้าเป็นเอกสารที่ generate ด้วย script ต่างๆด้วยแล้วให้ลองพยายามหาข้อความที่เป็น static ครับ เป็นไปได้พยายามอ้างจาก html tag ครับนับ tag ไปเรื่อยๆก็ได้ครับ
Wed 11 Jan 2006 11:14:04
ผมลองทำดูแล้วครับแต่มันก้ยังติดปัญหาครับคือ
<tr >
<td class="num">1:</td>
<td>Start out going NORTHWEST on N CLARK ST toward W IRVING PARK RD / IL-19.</td>
<td class="nowrap"><0.1 miles</td>
</tr>
<tr class="bgc">
<td class="num">2:</td>
<td>Turn LEFT onto W IRVING PARK RD / IL-19.</td>
<td class="nowrap">0.8 miles</td>
</tr>
ข้อมูลที่ fopen มาจะอยู่ประมาณนี้ครับ แต่ที่ต้องการให้มันมาสแดงต้องการแค่ขอ้ความที่อยู่ใน <td> ที่2 ของแต่ละ <tr> ครับผมลองทำดูแล้วมันขึ้นข้อมูลมาทั้งหมดเลยครับ ผมจะมีวิธีตรวจสอบยังงัยว่าเอา <td> ที่2 ของแต่ละ <tr> ครับ
$a1=strpos($data,'<td>');
$a2=strrpos($data,'</td>');
echo substr($data,$a1,$a2-$a1);
<?
$data = array('<tr >',
'<td class="num">1:</td>',
'<td>Start out going NORTHWEST on N CLARK ST toward W IRVING PARK RD / IL-19.</td>',
'<td class="nowrap"><0.1 miles</td>',
'</tr>',
'<tr class="bgc">',
'<td class="num">2:</td>',
'<td>Turn LEFT onto W IRVING PARK RD / IL-19.</td>',
'<td class="nowrap">0.8 miles</td>',
'</tr>');
$ret = "";
while(list($key,$val) = each($data)){
echo "Original : ".$val."\n";
if(($pos = strpos($val, "<td class=\"num\">")) !== false){
$ret["id"][] = str_replace("</td>", "", substr($val, $pos + strlen("<td class=\"num\">")));
}
if(($pos = strpos($val, "<td>")) !== false){
$ret["name"][] = str_replace("</td>", "", substr($val, $pos + strlen("<td>")));
}
if(($pos = strpos($val, "<td class=\"nowrap\">")) !== false){
$ret["miles"][] = str_replace("</td>", "", substr($val, $pos + strlen("<td class=\"nowrap\">")));
}
}
print_r($ret);
?>
ลองเอาไปทดลองดูครับ
Thu 12 Jan 2006 14:16:54
ขอบคุณพี่ Administrator มากเลยนะครับ ตอนนี้ผมทำได้แล้วครับ
Fri 21 Sep 2007 17:23:52
พี่ค่ะอยากถามว่า appserv ที่ใช้ได้กับ vista อ่ะค่ะ มีตัวไหนใช้domxml ได้มั่งค่ะ หนูโหลดของversion 2.5.8 มาค่ะ ใน phpinfo มีdomxml ค่ะ แต่ใน php.ini ไม่เห็นมี extension=php_domxml.dll เลยค่ะ พอมาใช้ version 2.3.0 ก็ startappserv ไม่ได้หนูจะทำไงดีค่ะ kottang-_-@hotmail.com
Sun 23 Sep 2007 21:11:21

















