我们平时经常会遇到提取某个html中某个table的信息
比如
我们要提取出序号、登记编号、出质人等等。我的思路是先通过正则锁定该table,在通过Jsoup来按列解析内容。
我将提取信息的过程抽取出了一个方法,其中内含Jsoup和Regex
/**
* 从table中提取所有td的方法 返回一个list包含table中所有数据
*
* @param html
* 所要提取的html
* @param regex
* 要解析的table的正则
* @param tdNum
* 每个tr中的td个数
* @return List
* @author kfh
*/
public List extractTable(String html, String regex, int tdNum) {
ArrayList result = new ArrayList();
String content = this.getValue(html, regex);
// 如果开头缺失table标签,则补全之
if (!content.startsWith("
content = "
}
if (StringUtils.isEmpty(content)) {
logger.info("抓取table为空, 网页无相关信息或正则出错...");
return null;
} else {
Document table = Jsoup.parse(content);
if (table != null) {
Elements trs = table.select("tr:has(td)");
for (Iterator iterator = trs.iterator(); iterator.hasNext();) {
// 拿到第一个tr
Element tr = (Element) iterator.next();
// 得到tds
Elements tds = tr.select("td");
// 如果td的size正好等于tdNum
if (tds.size() == tdNum) {
for (int i = 0; i <= (tdNum - 1); i++) {
result.add(tds.get(i).text());
}
} else {
// 如果td的size 小于tdNum
for (int i = 0; i <= (tds.size() - 1); i++) {
result.add(tds.get(i).text());
}
}
}
}
return result;
}
}
☆说明:
if (!content.startsWith("
content = "
}
为什么会存在呢?是因为我从一个页面中唯一定位一个包含"股权出质信息"的table的时候需要的正则是像这样子的:
股权出质登记信息[\s\S]*?是定位到包含"股权出质登记信息"作为th的唯一table ,所以我用jsoup解析的时候就手动将table标签的开始标签补齐了,返回的List包含table中所有的列