文本匹配求助-查找手机号
本帖最后由 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,并不是我想要的手机号。
请问我的匹配命令错在哪里?应该如何修改呢?
电子邮箱又应该如何取呢?
本帖最后由 523066680 于 2017-12-28 09:45 编辑
回复 1# bikkuri
用HTML::Parse 模块,或者 Mojo::Dom 模块
将网页内容保存到 src.html,
use feature 'say';
use Mojo::DOM;
use File::Slurp;
# Parse
my $html = read_file( "src.html", {binmode => ':raw'} );
my $dom = Mojo::DOM->new( $html );
# Find
for my $item ( $dom->find('div.person_attr_name')->each )
{
if ( $item->text() =~/Email:/i) { say $item->next->at('*')->text }
elsif ( $item->text() =~/Mobile:/i ) { say $item->next->at('*')->text }
}
输出
joe.wang@goole.com
+8613618580000
回复 2# 523066680
非常感谢您的帮助!如果只用正则表达式应该怎么抓取这两个信息呢?
回复 3# bikkuri
use feature 'say';
use File::Slurp;
my $stream = read_file( "src.html" );
#Getting Email
if ($stream=~/>([^<]+@[^<]+)</) {
say $1;
}
#Getting Mobile No.
if ($stream=~/Mobile:.*?telnum">([^<]+)</is) {
say $1;
}
回复 4# 523066680
非常感谢。我用以下命令也得到了正确结果。
if (/Mobile: /../<span class=\"telnum\"\>+(.+)\<\/span\>.*$/) { $mobile = $1; }
if (/Email: /../href=\"mailto:+(.+)\"\>.*$/) { $email = $1; }
回复 6# 本友会机友会摄友会
正则是最高效的办法。
html xml解析只是看起来高端。
然后如果遇到不完整的 html xml,可能更麻烦。
回复 7# q1208c
应该说正则和parser各有优缺点。总的来说parser的方法更robust,更容易cover源数据格式中的一些细微差别,相比自己直接写regexp也更难写出bug。正则主要可以用来做一些针对特殊情况的解决方案,比如你说的不完整的html。
我觉得现在各种标准化格式化数据(html/xml/json/csv等等)的广泛引用,以及支持这些格式的各种成熟的库,一定程度上弱化了Perl相对其它语言的regexp优势的重要性。我早年在半导体行业的时候,有时要处理几G大小的文件,都是用Perl regexp写ad-hoc的脚本,当年正则也算玩得飞起。然而后来转行做程序猿,每天用Perl,却(相对地)很少用regexp了。
<script>
$(".person_attr_name").each(function(){
if($(this).text().search(/Mobile/) != -1){
console.log($(this).next().text() + "\n");
}
});
</script>
页:
[1]