從一段html的table標籤中按列提取信息

咱們平時常常會遇到提取某個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

相關文章
相關標籤/搜索