如何使用正则表达式在jsoup文档中获取电话号码

时间:2017-08-16 07:07:48

标签: java web-scraping jsoup

我使用jsoup连接到url并加载文件后我使用正则表达式检查文档是否包含它。但在某些情况下它失败了。以下代码从某些网址中获取所有电话号码,但在http://www.wellclean.com/之类的其他网址中失败,而我在打印文档时检查该文档包含电话号码。

String regex_num = "^\\+?[0-9. ()-]{10,25}$";
Pattern pattern = Pattern.compile(regex_num);
Document doc  = Jsoup.connect(url)
        .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0")
        .maxBodySize(0)
        .timeout(600000)
        .get();

Elements Phone_Num=doc.getElementsMatchingOwnText(pattern);// match regex in doc
if(!Phone_Num.isEmpty()) // if phone number exist
{
    System.out.println("Phone number found!");
    for(Element e : Phone_Num)
    {
        PNUM=PNUM+e.text().toString()+" & "; // store all phone number seperated by &
    }

}

当我打印doc时,它包含以下格式的电话号码

<div class="contact_address">
     <div class="contact_column_1">
      2261 N. Clybourn Ave.
    <br> Chicago, IL 60614
    <br> Ph: (773) 348.2226
    <br> 
    <a href="http://maps.google.com/maps?q=2261+N.+Clybourn+Ave.Chicago,+IL+60614&amp;hl=en&amp;sll=41.923214,-87.666462&amp;sspn=0.014417,0.029268&amp;gl=us&amp;hnear=2261+N+Clybourn+Ave,+Chicago,+Cook,+Illinois+60614&amp;t=m&amp;z=17" target="_new"><img src="/wp-content/themes/artgallery_3.0/images/map.png" alt="map"></a>
    <br> Hours:
    <br> M-S 7:30am – 7:00pm
    <br> Sun 9:00am – 5:00pm
   </div> 
   <div class="contact_column_2">
    &nbsp;
    <br>&nbsp;
</div> 

2 个答案:

答案 0 :(得分:2)

它与给定的HTML不匹配,因为您的模式^\\+?[0-9. ()-]{10,25}$表示条件,您要查找的元素具有以包含完全匹配给定模式的主体。这是因为您在开头使用了^而在模式结尾使用了$,这在大多数情况下都可以 - 您希望限制性地限制所有匹配。

这种模式与

结合使用效果很好
Document.getElementsMatchingOwnText(Pattern pattern)

方法,如果您要查找的电话号码是唯一的HTML标记正文,例如如果您正在解析的HTML看起来像这样:

<br> Ph: <span>(773) 348.2226</span>

如何解决?

在这种情况下,您必须更新您的模式以允许匹配元素,其中电话号码只是正文的一部分:

\\+?[0-9. ()-]{10,25}

现在运行程序时,您会看到调用e.text()返回

2261 N. Clybourn Ave. Chicago, IL 60614 Ph: (773) 348.2226 Hours: M-S 7:30am – 7:00pm Sun 9:00am – 5:00pm

因为这是<div class="contact_column_1">元素的纯文本全文。在这种情况下,您必须使用相同的模式提取电话号码,例如

for(Element e : Phone_Num)
{
    Matcher matcher = pattern.matcher(e.text());
    if (matcher.find()) {
        PNUM += matcher.group(0).trim() + " & "; // store all phone number seperated by &
    }
}

我希望它有所帮助。

答案 1 :(得分:2)

我认为你必须处理你的正则表达式。

您正在使用方法getElementsMatchingOwnText并且您的正则表达式中包含^和$,这意味着您只能找到跨越整个标记的电话号码,即<tag>(773) 348.2226</tag>.

在您的示例中,html电话号码只是标有<div class="contact_column_1">

的标记的一部分