พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP development / ขอถามเกี่ยวกับ getElememt หน่อย...
ปู
ปู
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'>";
}
?>

Administrator
Thu 5 Jan 2006 11:41:42
คำสั่ง getElementsByTagName() อยู่ใน PHP 5 ครับ ส่วนถ้าใช้ PHP 4 นั้นต้องใช้ get_elements_by_tagname() ครับ
ปู
ปู
Thu 5 Jan 2006 11:45:19

ลองเปลี่ยนเป็น get_element_by_tagname แล้วก็ยังไม่ได้ครับ มันก็ยังฟ้องเหมือนเดิมครับ พออับขึ้นเว็บมันฟ้องว่า parse error, unexpected T_OBJECT_OPERATOR ตรงไหนผิดอีกเหรอครับ

Administrator
Thu 5 Jan 2006 15:49:22
<?
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

แล้วถ้าขึ้นอย่างนี้หมายความว่างัยครับ

Administrator
Thu 5 Jan 2006 18:45:02
ลองดูตัวอย่าง class ที่ใช้งาน DOMXML ได้ทั้งใน PHP 4 และ PHP 5 ได้ที่
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()

Administrator
Fri 6 Jan 2006 12:02:38
ลองใช้ phpinfo() ดูครับว่ามี domxml หรือยัง ส่วนการติดตั้งดูได้ที่นี่ครับ
http://th.php.net/domxml

เท่าที่เช็คดูแล้ว domxml ใน php4 จะไม่มีคำสั่ง loadhtmlfile นะครับ
ปู
ปู
Fri 6 Jan 2006 16:18:29

ใช่ค่ะไปดูมาแล้วว่า loadhtmlfile ใช้ไม่ได้จิงๆด้วยครับ ถ้างั้นมีคำสั่งไหนใช้แทนกันได้บ้างครับ ผมลองใช้ domxml_open_mem กะ domxml_open_file ก็ใช้ไม่ได้อ่ะครับ เพราะว่ามันต้องใช้เป็นไฟล์ xml แต่ไฟล์ที่ใช้มันเป็น html อ่ะครับผมต้องทำยังงัยดีครับ หัวหน้าเร่งงานอยู่ช่วยผมหน่อยนะครับ

Administrator
Fri 6 Jan 2006 22:23:09
ไม่ทราบว่าที่ทำอยู่นี่เป็นโปรแกรมเกียวกับอะไรหรือครับ ผมยังเดาไม่ออกเลย เผื่อจะนึกวิธีอื่นนอกจาก DOM ได้ครับ หรือไม่อย่างนั้นก็ลองเปลี่ยนไปใช้ PHP 5 ดูครับ
ปู
ปู
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

Administrator
Sat 7 Jan 2006 11:59:11
ตัวโปรแกรมที่ต้องการคือการ post ค่าไปยัง site อื่นแล้วรอรับค่ามาแสดงผล ผมเข้าใจถูกไหมครับ ถ้าใช่ผมว่า cURL น่าจะเข้ากับ โปรแกรมที่ต้องการมากที่สุดครับ

ส่วน 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 ผมก็ไม่เข้าใจว่ามันเป็นยังงัยอ่ะครับ ช่วยแนะนะผมหน่อยนะครับ

Administrator
Mon 9 Jan 2006 15:23:11
ที่ผมแนะนำ cURL นั้นโดยการทำงานของ cURL นั้นจะเป็นการส่งข้อมูลหรือเป็นการร้องขอข้อมูลไปยัง script ใดๆครับ โดยข้อมูลที่ได้รับกลับมาก็จะเป็น document ที่มีการแสดงผลจากไฟล์ที่ได้ร้องขอไปครับ การทำงานคล้ายๆ Webservices ครับ (เพียงแต่จะต้องสร้าง format ของเอกสารเอง)

แต่เท่าที่อ่านมาตลอดเข้าใจว่าคุณกำลังต้องการทำโปรแกรม parser ใช่ไหมครับ คงต้องบอกว่าต้องทำการเขียน parser ขึ้นมาเองครับ ไม่สามารถใช้ module ช่วยได้ครับ โดยพยายามใช้ ereg() ในการเปรียบเทียบแทนการใช้ query ด้านบนครับ (เคยหาเพื่อทำให้ลูกค้าเหมือนกันครับแต่ไม่มีครับสุดท้ายต้องทำด้วยตัวเองครับ) Smile
ปู
ปู
Tue 10 Jan 2006 11:23:43

ช่วยแนะนำหน่อยสิครับว่าต้องเขียนประมาณไหน คำสั่ง ereg() อ่ะครับ ผมลองเขียนแล้วมันส่งค่ากลับมาเป็น 1 แล้วไม่รู้ว่าจะใช้คำสั่งไหนต่อดีพวก str ทั้งหลายอ่ะครับ

Administrator
Tue 10 Jan 2006 11:47:59
คุณต้องทำการอ่านเอกสาร html แล้วต้องพยายามหา unique word ในเอกสารนั้นให้เจอครับ โดยพยายามให้อยู่ใกล้ๆกับ ข้อมูลที่ต้องการให้มากที่สุดครับ ใช้ strstr() ก็ได้ครับเพื่อหาตำแหน่ง แล้วอ้างจากตำแหน่งนั้นไปยังข้อมูลที่ต้องการครับ

**เข้าใจว่าเป็นการ 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);

Administrator
Wed 11 Jan 2006 12:49:51
จากข้อมูลข้างบนนี้สามารเขียนได้เป็น

<?
$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   

webmaster
webmaster
Sun 23 Sep 2007 21:11:21
ขออภัยด้วยครับ ไม่เคยติดตั้ง AppServe เลยครับ เลยไม่ได้ติดตามว่ามีปัญหาใดหรือไม่
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login