咱們平時常常會遇到提取某個html中某個table的信息html
好比java
咱們要提取出序號、登記編號、出質人等等。個人思路是先經過正則鎖定該table,在經過Jsoup來按列解析內容。 this
我將提取信息的過程抽取出了一個方法,其中內含Jsoup和Regexspa
/** * 從table中提取全部td的方法 返回一個list包含table中全部數據 * * @param html * 所要提取的html * @param regex * 要解析的table的正則 * @param tdNum * 每一個tr中的td個數 * @return List<String> * @author kfh */ public List<String> extractTable(String html, String regex, int tdNum) { ArrayList<String> result = new ArrayList<String>(); String content = this.getValue(html, regex); // 若是開頭缺失table標籤,則補全之 if (!content.startsWith("<table>")) { content = "<table>" + 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; } }
☆說明:code
if (!content.startsWith("<table>")) {
content = "<table>" + content;
} htm
爲何會存在呢?是由於我從一個頁面中惟必定位一個包含"股權出質信息"的table的時候須要的正則是像這樣子的:get
<th.*>股權出質登記信息[\s\S]*?</table>it
是定位到包含"股權出質登記信息"做爲th的惟一table ,因此我用jsoup解析的時候就手動將table標籤的開始標籤補齊了,返回的List包含table中全部的列table