從網頁 HTML 中提取版權聲明(如「版權所有 © 2024 XXX」),論文提到用 11 種正則,實際上**現代 HTML 解析器 + 選擇器**遠比正則健壯。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public static void main(String[] args) throws IOException {
// 1. 獲取文檔
Document doc = Jsoup.connect("https://www.ccopyright.com.cn/cpcc/index.jsp")
.timeout(10000)
.get();
// 2. 選擇包含關鍵字的元素(支援 CSS 選擇器、XPath 風格)
Elements copyrightElements = doc.select(":containsOwn(版權所有)");
// 或更精確:doc.select("footer, .copyright, [class*=copyright], [id*=copyright]")
// 3. 提取純文本
for (Element el : copyrightElements) {
String text = el.text(); // 自動去除標簽,合併文本節點
System.out.println(text);
}
}
| 正則痛點 | Jsoup 優勢 |
|---|---|
| HTML 結構變動(換行、屬性順序、巢狀)導致失效 | DOM 模型穩定,選擇器針對語義結構 |
| 編碼實體 (`©`, `©`) 需手動解碼 | 自動解碼實體,輸出可讀文本 |
| 跨標簽文本(`版權`)難匹配 | `.text()` 自動遞歸提取所有後代文本 |
| 惡意/畸形 HTML 導致災難性回溯 | 容錯解析器,類似瀏覽器容錯能力 |
// 常見版權區域選擇器組合
String selector = "footer, " +
".copyright, .copy-right, .footer-copyright, " +
"[class*=copyright], [id*=copyright], " +
"meta[name=copyright], " +
"small:contains(©), small:contains(版權)";
Elements els = doc.select(selector);
String copyright = els.stream()
.map(Element::text)
.filter(s -> s.length() > 5)
.findFirst()
.orElse("未找到");
**拋棄脆弱正則,擁抱 Jsoup/HtmlUnit/Playwright 等結構化解析器,才是爬蟲正道。**