如何使用 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
元素中存储为 TextNode
s,
- 每个相关的 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);
例如 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
元素中存储为TextNode
s, - 每个相关的 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);