You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期筛选curl获取的XML中的指定URL?

解决XML中筛选指定日期的URL条目问题

处理XML这种结构化数据,别用grep/awk硬正则匹配,很容易因为标签换行、嵌套结构出问题,优先用专门的XML处理工具,给你几个可行方案:

方案1:用xmlstarlet(推荐)

xmlstarlet是专门的XML命令行工具,能精准解析结构,先确保你的系统安装了它(Debian/Ubuntu用apt install xmlstarlet,macOS用brew install xmlstarlet)。

假设你的XML结构是类似这样的(每个条目包含和):

https://example.com/1 2023-07-01 https://example.com/2 2023-08-05

执行以下命令就能直接输出2023-07的URL和对应日期:

curl -s https://url.com | xmlstarlet sel -t -m "//entry[starts-with(date/text(), '2023-07')]" -v "concat(log/text(), ' | ', date/text())" -n
  • -m "//entry[starts-with(date/text(), '2023-07')]":匹配所有包含日期以2023-07开头的节点
  • -v "concat(...)":把和的文本内容拼接后输出
  • -n:每个结果换行

如果你的XML节点名不同(比如条目是,URL是),只需要修改XPath里的节点名即可,比如//logitem[starts-with(date/text(), '2023-07')]。

方案2:用xmllint(系统自带概率高)

如果不想装新工具,xmllint很多系统默认自带(属于libxml2-utils包,Debian/Ubuntu可装apt install libxml2-utils),结合简单的文本处理命令也能实现:

curl -s https://url.com | xmllint --xpath "//entry[starts-with(date/text(), '2023-07')]" - | grep -E '(<log>|<date>)' | sed -e 's/<\/\?log>//g' -e 's/<\/\?date>//g' | paste - -

步骤分解:

  1. 用xmllint筛选出符合日期条件的节点
  2. grep提取出包含和的行
  3. sed去掉标签,只保留文本内容
  4. paste把相邻的URL和日期行合并成一行

方案3:应急用awk(不推荐)

如果实在只能用awk,假设你的XML里和是成对连续出现的(没有跨太多行或嵌套),可以试试:

curl -s https://url.com | awk '/<log>/ {url=$0; sub(/<\/?log>/,"",url)} /<date>/ {date=$0; sub(/<\/?date>/,"",date); if (date ~ /^2023-07/) print url, "|", date}'

这个逻辑是:遇到行就提取并清理URL;遇到行就提取清理日期,判断日期前缀是2023-07就输出配对的URL和日期。但如果XML结构有变化(比如标签换行、中间插了其他节点),这个命令就会失效,所以仅作应急用。

内容的提问来源于stack exchange,提问作者cristobal veas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:20:14