bikkuri 发表于 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,并不是我想要的手机号。
请问我的匹配命令错在哪里?应该如何修改呢?
电子邮箱又应该如何取呢?

523066680 发表于 2017-12-28 09:43

本帖最后由 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

bikkuri 发表于 2017-12-28 10:22

回复 2# 523066680

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

523066680 发表于 2017-12-28 10:56

回复 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;
}

bikkuri 发表于 2017-12-28 11:11

回复 4# 523066680

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

本友会机友会摄友会 发表于 2017-12-28 16:04

q1208c 发表于 2017-12-30 12:53

回复 6# 本友会机友会摄友会

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

zhouzhen1 发表于 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了。

sunzhiguolu 发表于 2018-01-02 20:46

<script>
$(".person_attr_name").each(function(){
    if($(this).text().search(/Mobile/) != -1){
      console.log($(this).next().text() + "\n");
    }
});
</script>
页: [1]
查看完整版本: 文本匹配求助-查找手机号