首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 從網頁擷取文字:避免硬編碼解析,善用正則或 HTML 解析器

     編輯:程式設計綜合問答

問題現象

嘗試用 indexOf/substring 從 HTML 字串中擷取 IP 位址,因 HTML 結構微調(換行、空白、屬性順序)導致解析失敗。

錯誤寫法

// 硬編碼字串位置,極度脆弱
int index = response_str.indexOf("Remote IP Address:");
index += "Remote IP Address:".length();
index += "</div><br /><div id=\"value1\">".length();
int end = response_str.indexOf("</div><br /><br />", index);
String strIP = response_str.substring(index, end);

穩健解決方案

方案一:正則表達式(輕量,適合固定模式)

// 針對目標 HTML 結構
Pattern pattern = Pattern.compile("Remote IP Address:.*?<div id=\"value1\">(.*?)</div>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
    String ip = matcher.group(1).trim();  // 49.156.53.152
}

方案二:Jsoup HTML 解析器(推薦,結構化查詢)

// build.gradle
implementation 'org.jsoup:jsoup:1.17.2'

// 程式碼
Document doc = Jsoup.parse(html);
Element ipDiv = doc.selectFirst("div#value1");
String ip = ipDiv != null ? ipDiv.text() : "";

優點:抗 HTML 格式變化、支援 CSS 選擇器、自動處理實體編碼。

方案三:split 簡易切割(僅限極固定格式)

String[] parts = html.split("\\*\\*");  // 若 IP 以 ** 包裹
if (parts.length > 1) String ip = parts[1];

網路請求最佳實踐

  • 棄用 DefaultHttpClient,改用 OkHttp + 協程/Flow。
  • 網路請求必須在 IO 執行緒,嚴禁主執行緒。
  • 加入逾時、重試、錯誤處理與快取策略。
// OkHttp + 協程範例
suspend fun fetchIp(url: String): String = withContext(Dispatchers.IO) {
    val response = OkHttpClient().newCall(Request.Builder().url(url).build()).execute()
    val html = response.body?.string() ?: ""
    Jsoup.parse(html).selectFirst("div#value1")?.text() ?: ""
}

核心原則

永遠不要用字串索引硬解析 HTML/JSON/XML。選擇適合的結構化解析器(Jsoup、Gson、XmlPullParser),程式碼才能經得起版本迭代與格式微調。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved