忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2873 | 回复: 8

文本匹配求助-查找手机号 [复制链接]

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-12-28 02:47 |显示全部楼层
本帖最后由 bikkuri 于 2017-12-28 03:13 编辑

大家好!
我有一个问题向大家请教。

我有一段文本,想从中取出Email:后面的电子邮箱和Mobile:后面的手机号。
...
<div class="person_item">
<div class="person_attr_name">Business title: </div>
<div class="person_attr_value">Advisory Engineer</div>
</div>
<div class="person_item">
<div class="person_attr_name">Email: </div>
<div class="person_attr_value"><a href="mailto:joe.wang@goole.com">joe.wang@goole.com</a></div>
</div>
<div class="person_item">
<div class="person_attr_name">CSLogin: </div>
<div class="person_attr_value">joew</div>
</div>
<div class="person_item">
<div class="person_attr_name">Handle: </div>
<div class="person_attr_value">joew</div>
</div>
...
<div class="person_item">
<div class="person_attr_name">Phone: </div>
<div class="person_attr_value">
<span class="telnum">+8621545045550000</span>
</div>
</div>
<div class="person_item">
<div class="person_attr_name">Other Phone: </div>
<div class="person_attr_value">
<span class="telnum">27440000</span>
</div>
</div>
<div class="person_item">
<div class="person_attr_name">Mobile: </div>
<div class="person_attr_value">
<span class="telnum">+8613618580000</span>
</div>
</div>
<div class="person_item">
<div class="person_attr_name">Assistant: </div>
<div class="person_attr_value">
<span class="telnum">+86 21545045550000</span>
</div>
</div>
...
我用if (/Mobile: \<\/div\>\n\<div class=\"person_attr_value\"\>\n\<span class=\"telnum\"\>+(.+)\<\/span\>.*$/)   { $mobile = $1; }无法取出。
如果用if (/span class=\"telnum\"\>+(.+)\<\/span\>.*$/)   { $mobile = $1; }可以取出+86 21545045550000,并不是我想要的手机号。
请问我的匹配命令错在哪里?应该如何修改呢?
电子邮箱又应该如何取呢?

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2017-12-28 09:43 |显示全部楼层
本帖最后由 523066680 于 2017-12-28 09:45 编辑

回复 1# bikkuri

用  HTML::Parse 模块,或者 Mojo::Dom 模块

将网页内容保存到 src.html,
  1. use feature 'say';
  2. use Mojo::DOM;
  3. use File::Slurp;

  4. # Parse
  5. my $html = read_file( "src.html", {binmode => ':raw'} );
  6. my $dom = Mojo::DOM->new( $html );

  7. # Find
  8. for my $item ( $dom->find('div.person_attr_name')->each )
  9. {
  10.     if    ( $item->text() =~/Email:/i  ) { say $item->next->at('*')->text }
  11.     elsif ( $item->text() =~/Mobile:/i ) { say $item->next->at('*')->text }
  12. }
复制代码

输出
joe.wang@goole.com
+8613618580000

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-12-28 10:22 |显示全部楼层
回复 2# 523066680

非常感谢您的帮助!如果只用正则表达式应该怎么抓取这两个信息呢?

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2017-12-28 10:56 |显示全部楼层
回复 3# bikkuri

  1. use feature 'say';
  2. use File::Slurp;

  3. my $stream = read_file( "src.html" );

  4. #Getting Email
  5. if ($stream=~/>([^<]+@[^<]+)</) {
  6.     say $1;
  7. }

  8. #Getting Mobile No.
  9. if ($stream=~/Mobile:.*?telnum">([^<]+)</is) {
  10.     say $1;
  11. }
复制代码

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-12-28 11:11 |显示全部楼层
回复 4# 523066680

非常感谢。我用以下命令也得到了正确结果。
         if (/Mobile: /../<span class=\"telnum\"\>+(.+)\<\/span\>.*$/)   { $mobile = $1; }
         if (/Email: /../href=\"mailto:+(.+)\"\>.*$/)   { $email = $1; }

论坛徽章:
0
发表于 2017-12-28 16:04 |显示全部楼层
本题解法:
1 正则。点评:已经out。
2 解析html,xml。出对象。点评:正解。
3 模版匹配。点评:最简单!

----------------------------------------------------------------
powershell模版匹配,解题例子:
http://bbs.chinaunix.net/thread-4290779-1-1.html
----------------------------------------------------------------

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2017-12-30 12:53 |显示全部楼层
回复 6# 本友会机友会摄友会

正则是最高效的办法。
html xml解析只是看起来高端。
然后如果遇到不完整的 html xml,可能更麻烦。

论坛徽章:
0
发表于 2018-01-01 12:25 |显示全部楼层
回复 7# q1208c

应该说正则和parser各有优缺点。总的来说parser的方法更robust,更容易cover源数据格式中的一些细微差别,相比自己直接写regexp也更难写出bug。正则主要可以用来做一些针对特殊情况的解决方案,比如你说的不完整的html。
我觉得现在各种标准化格式化数据(html/xml/json/csv等等)的广泛引用,以及支持这些格式的各种成熟的库,一定程度上弱化了Perl相对其它语言的regexp优势的重要性。我早年在半导体行业的时候,有时要处理几G大小的文件,都是用Perl regexp写ad-hoc的脚本,当年正则也算玩得飞起。然而后来转行做程序猿,每天用Perl,却(相对地)很少用regexp了。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2018-01-02 20:46 |显示全部楼层
  1. <script>
  2. $(".person_attr_name").each(function(){
  3.     if($(this).text().search(/Mobile/) != -1){
  4.         console.log($(this).next().text() + "\n");
  5.     }
  6. });
  7. </script>
复制代码
jq.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP