使用Curl从html表中获取信息

时间:2012-04-23 20:55:25

标签: php curl simple-html-dom

我需要获取一些植物的信息并将其放入mysql表中。 我对Curl和DOM的了解非常简单,但我已经明白了这一点:

    set_time_limit(0);
include('simple_html_dom.php');


$ch = curl_init ("http://davesgarden.com/guides/pf/go/1501/"); 

curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;     rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: es-es,en"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec ($ch); 
curl_close ($ch); 


$html= str_get_html($data);


$e = $html->find("table", 8);

 echo $e->innertext;

现在,我真的迷失了如何从这一点入手,你能指导我吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

这是一团糟。

但至少这是一个(有点)一致的混乱。

如果这是一次性提取而不是滚动项目,我个人会使用快速而脏的正则表达式而不是simple_html_dom。你会整天待在那里弄乱标签。

例如,这个正则表达式拉出了大多数标题/数据对:

$pattern = "/<b>(.*?)</b>\s*<br>(.*?)</?(td|p)>/si";

你需要先进行一些前后清洁,然后再将它们全部清理干净。

我不羡慕你有这个任务......

答案 1 :(得分:1)

你最好的选择是将它包装在php中;)

是的,对于丑陋的HTML代码来说,这是一个丑陋的黑客攻击。

<?php
ob_start();
system("
    /usr/bin/env links -dump 'http://davesgarden.com/guides/pf/go/1501/' |
    /usr/bin/env perl -lne 'm/((Family|Genus|Species):\s+\w+\s+\([\w-]+\))/ && \
        print $1'
");
$out = ob_get_contents();
ob_end_clean();
print $out;
?>

答案 2 :(得分:0)

使用Simple Html Dom,您就可以访问所需的任何元素/元素内容。他们的api非常简单。

答案 3 :(得分:0)

你可以尝试这样的事情。

<?php 
$ch = curl_init ("http://www.digionline.ir/Allprovince/CategoryProducts/cat=10301");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($ch);

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($page);
libxml_clear_errors();
$xpath = new DOMXpath($dom);

$data = array();
// get all table rows and rows which are not headers
$table_rows = $xpath->query('//table[@id="tbl-all-product-view"]/tr[@class!="rowH"]');
foreach($table_rows as $row => $tr) {
    foreach($tr->childNodes as $td) {
        $data[$row][] = preg_replace('~[\r\n]+~', '', trim($td->nodeValue));
    }
    $data[$row] = array_values(array_filter($data[$row]));
}

echo '<pre>';
print_r($data);
?>