我使用jsoup连接到url并加载文档后,使用正则表达式检查文档是否包含它,但在某些情况下会失败。下面的代码从某些URL中获取所有电话号码,但在诸如http://www.wellclean.com/之类的其他URL中却失败,而我在打印文档时检查该文档是否包含电话号码。
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 &
}
}
当我打印文档时,它包含以下格式的电话号码
<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&hl=en&sll=41.923214,-87.666462&sspn=0.014417,0.029268&gl=us&hnear=2261+N+Clybourn+Ave,+Chicago,+Cook,+Illinois+60614&t=m&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">
<br>
</div>
最佳答案
它与给定的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 &
}
}
希望对您有所帮助。