如何使用 JSOUP 解析非结构化数据(即来自 HTML 目录列表)?

How to parse unstructured data (i.e. from an HTML directory listing) using JSOUP?

例如 https://download.bls.gov/pub/time.series/ 显示日期/时间戳/文件大小信息,这些信息似乎没有包含在 HTML 标签中。如果我们想考虑与每个 link 相关的日期和时间戳信息,使用 JSoup 捕获此信息的理想技术是什么。

<br> 9/14/2021  8:31 AM         2114 <A HREF="/pub/time.series/ap/ap.area">ap.area</A><br> 4/14/2005  2:53 PM          987 <A HREF="/pub/time.series/ap/ap.contacts">ap.contacts</A><br>

是否可以有效地解析此类信息存在一些争论 - 。

但是如果我们检查您的具体示例,我们会观察到以下内容:

  • 您的 file/folder 元数据在 pre 元素中存储为 TextNodes,
  • 每个相关的 file/folder link(a 元素)前面都有一个直接同级 br。好吧,除了根目录:https://download.bls.gov/。你必须单独对待那个案例。

这构成了有效查询所需的足够信息:

Document doc = Jsoup.connect("https://download.bls.gov/pub/time.series/").get();
Elements links = doc.select("pre br + a");
List<TextNode> metaData = doc.select("pre").textNodes();
for (int i = 0; i < links.size(); i++) {
    String metaDataRow = metaData.get(i).toString();
    System.out.println(metaDataRow  + " | " + links.get(i));
}

您可以进一步拆分 metaDataRow 以提取时间戳,如下所示:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy pph:m a", Locale.ENGLISH);
// ...
String[] metaColumns = metaDataRow.split("        ");
LocalDate lastUpdated = LocalDate.parse(metaColumns[0].strip(), formatter);