网页信息的提取是一个很大的研究课题,可能涉及到并行计算、人工智能、机器学习等领域。今天,我们来学一下如何用正则表达式和HTMLParser提取网页内容。
正则表达式:
基本格式:
Pattern pattern=Pattern.compile(匹配表达式,flag);
Matcher mc=pattern.matcher(匹配域)
while(mc.find())
{
string=mc.group(index).trim();
}
提示:
匹配表达式要到匹配域中匹配;
flag表示pattern的一些特殊模式,比如Pattern.MULTILINE或Pattern.DOTALL。但这些主要是注重一些细节,一般对大体上没 什 么妨碍。但是现在我对'^'和 '$'匹配每一行的开始和结束还不是很了解。
据我的理解,string的内容就是匹配表达式中第index的(.*)所匹配的内容。
举一个简单的例子:
Pattern pattern=Pattern.compile("<TD CLASS=btd WIDTH=198 BGCOLOR=/"#FCFCFC/"><B>(.*)</B></TD>",Pattern.DOTALL);
Matcher mc=pattern.matcher(content);
while(mc.find())
{
string=mc.group(1).trim();
}
String的内容就是上面匹配表达式中红色区域缺少的内容。
注:index是从‘1’开始的,而不是从‘0’开始。
HTMLParser:
举例说明;
NodeFilter filter=new AndFilter(new TagNameFilter("td"),new HasChildFilter(new TagNameFilter("b")));
NodeList nodeList=parser.parse(filter)
Node node=nodeList.elementAt(0)
这里是网页中标签符合<td>含有子标签<b>的第一个节点。
nodeText=node.getFistChild.getNextSibling().toHtml();
这里举的例子如<td class=""><b>好人</b></td>,则可知FirstChild为<b>,而NextSibling()就是‘好人’。
Node node1=nodeList.elementAt(1)
这里是网页中标签符合<td>含有子标签<b>的第二个节点。
NodeList scdList=node1.getChildren()
提取这个<td>标签下的所用孩子节点。
scdtext=scdList.elementAt(3).toHtml().
取得第三个节点。例如:<td class=""><font color=""><b>好人</b></font></td>.
elementAt 0 1 2 3
主要内容讲的差不多了,现在补充一下吧:
比如,node.getNextSibliing().getNextSiblint().toHtml();与上述的孩子节点不同,这种情况一般用在属性Filter当中;
NodeFilter filter=new AndFilter(new TagNameFilter("td"),new HasAttributeFilter("class","");
<td class=""> <b> 好人 </b></td>
node NextSibling() NextSibling()
注意:getFirstChild与getNextSibling的取决并不是绝对的,比如说<H1 class="">就与<td class="">恰好相反。
这类例子这我的博客里很多,可以随便看看。
技巧:不知道是什么原因时可以把Node节点的实例node打印出来(就用System.out.println())。