php抓取百度邮编搜索结果,应改如何写正则表达式?

本人小白,想通过百度邮编搜索截取一个地址的邮编,在自己的网站空间里放了个php脚本。
因为要求不是很高,试图通过正则匹配找到第一组“首位不为0的六位数字”,作为结果输出,但是不管怎么尝试,得到的始终是一个空数组……
正则表达式是我从网上找的,也是过不同的形式,但是始终都得不到任何值

<?php
$final_url = http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8&p=mini&rn=20;
$search_result = file_get_contents$final_url;
$clear_result = strip_tags$search_result;
echo mb_detect_encoding$search_result;
echo"</br>";
echo$clear_result;
echo"</br>";
$zipcodes = search_for_zipcodes$clear_result;
print_r$zipcodes; function search_for_zipcodes$test { $rule = /^[1-9]d{5}$/; preg_match_all$rule,$test,$result; return $result;
} ?>

mb_detect_encoding$search_result,写这一句是想看看返回回来的页面的编码,但是这个函数似乎也得不到任何结果……

如果漏洞百出烦请诸位大神耐心指教,本人真的是小白一只……

题主啊, 你好.

我觉得, 你这个任务, 用不到正则.

为什么呢?

请看里面的搜索结果是什么?

 <table class="table-list" cellspacing="0"><tr><th class="head-postcode">邮编</th><th class="head-region">行政区域</th></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十路双号2218-5150</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十东路双号33188-33688</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 经十路单号177-3799</td></tr><tr><td>250102</td><td><em>山东省</em> <em>济南市</em> <em>历下区</em> 旅游路港沟水利站机关公寓</td></tr></table> 

好完整的结果, 这已经是一个列表了.

因为具体还没有看, 一会我来告诉你怎么处理.我先php试一下.

 <?php //有单独邮编的网址
$url = http://opendata.baidu.com/post/s?wd=%C9%BD%CE%F7&p=mini&rn=20; // 没有单独邮编的网址
//$url= http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8%C6%BD%B0%B2%BA%FA%CD%AC&p=mini&rn=20; // xpath 解析文档
$dom = new DOMDocument;
libxml_use_internal_errorsTRUE;
$dom->loadHTMLFile$url;
libxml_clear_errors;
$xPath = new DOMXPath$dom; //起作用的语句
$trs = $xPath->query//li/a/text|//tr/td; //输出结果
foreach$trs as $tr { $str= $tr->nodeValue; ifstrlen$str>6{ $str = array_pop explode , $str; } echo $str; break;
} ?>

http://phpfiddle.org/

你去phpfiddle 试一下吧, 还行. 做这种工作, xpath方便点.

<?php
$final_url = http://opendata.baidu.com/post/s?wd=%C9%BD%B6%AB%CA%A1%BC%C3%C4%CF%CA%D0%C0%FA%CF%C2%C7%F8&p=mini&rn=20;
$search_result = file_get_contents$final_url;
$search_result = iconvgbk, utf-8, $search_result;
preg_match_all"@<td>d+</td><td>.*?</td></tr>@is", $search_result, $match;
$area = array_map"strip_tags", $match[2];
print_r$match[1];
print_r$area;

把$rule = /^[1-9]d{5}$/;换成
$rule = /[1-9]d{5}/;试试
因为,你用了strip_tags.所以,很多内容,都直接合并成“一行”了。再用^,$应该是匹配不到的

发表评论

电子邮件地址不会被公开。 必填项已用*标注