使用htmlparser(http://htmlparser.sourceforge.net/)我一直在尝试从html表中提取信息(Content1 +链接)。
范例html:
<td class="xx">
<a href="http://link">Content1</a>
</td>
Java代码:
CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("td[class=\"xx\"]");
NodeList nodes = parser.parse(cssFilter);
resultSet = new String[nodes.size()][2];
for (int i=0;i<nodes.size();i++) {
resultSet[i][0]=nodes.elementAt(i).toPlainTextString().trim();
LinkTag tag = (LinkTag) (nodes.elementAt(i));
resultSet[i][1]=tag.getLink();
}
我可以毫无问题地提取第一部分(Content1字符串),但是在获取链接时遇到了麻烦。它要么说我不能在TextNode上强制转换(使用上面的代码),要么它返回null。
如上-结果:TableColumn无法转换为LinkTag
LinkTag tag = (LinkTag) (nodes.elementAt(i));
resultSet[i][1]=tag.getLink();
结果:TextNode无法强制转换为LinkTag
LinkTag tag = (LinkTag) (nodes.elementAt(i).getFirstChild());
resultSet[i][1]=tag.getLink();
结果:NullPointer
LinkTag tag = (LinkTag) (nodes.elementAt(i).getFirstChild().getFirstChild());
resultSet[i][1]=tag.getLink();
结果:返回null
Tag tag = (Tag) (nodes.elementAt(i));
resultSet[i][1]=tag.getAttribute("href");
感谢您的任何想法/解决方案=)
最佳答案
如果打印出<TD>
标记的内容,则会得到:
Tag (27[2,8],42[2,23]): td class="xx"
Txt (42[2,23],56[3,12]): \n
Tag (56[3,12],75[3,31]): a href="foo.html"
Txt (75[3,31],78[3,34]): bar
End (78[3,34],82[3,38]): /a
Txt (82[3,38],92[4,8]): \n
End (92[4,8],97[4,13]): /td
因此,您想要的是TD的第一个孩子的兄弟姐妹-尽管此时您受表中任何格式的摆布。
要查找表数据中的第一个链接,可以使用以下代码:
public static void main(String[] args) throws Exception {
Parser parser = new Parser("file:test.html");
CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("td[class=\"xx\"]");
NodeList nodes = parser.parse(cssFilter);
String[][] resultSet = new String[nodes.size()][2];
for (int i=0;i<nodes.size();i++) {
Node n = nodes.elementAt(i);
System.out.println(n); // DEBUG remove me!
resultSet[i][0]=n.toPlainTextString().trim();
resultSet[i][1]=null;
Node c = n.getFirstChild();
while( c!=null ) {
if( c instanceof LinkTag ) {
resultSet[i][1] = ((LinkTag) c).getLink();
break;
}
c = c.getNextSibling();
}
System.out.println(i+" text :"+resultSet[i][0]); // DEBUG remove me!
System.out.println(i+" link :"+resultSet[i][1]); // DEBUG remove me!
}
}