如何像正则一样验证 HTML 并提取出捕获内容?

@Ta 2023-09-02 6748点击

1. 比如,描述老虎林论坛首页的 HTML 结构(我也没想好语法,随便借用一些正则语法吧)

^  <!-- 匹配开头。暂时忽略 html、head 之类的标签 -->
<body style=any>  <!-- 样式任意 -->
  <header any*> <any** any*/> </header>  <!-- 任意个属性、后代节点(属性任意) -->
  <div class="container">
    <any** any*>  <!-- 忽略中间若干层节点。类似 xpath 中的 // -->
      (?<帖子列表>  <!-- 类似 js 正则中的命名捕获组 -->
      <ul class="topic-ul">  <!-- 帖子列表 -->
        <li>
          (?<用户信息>
          <div class="topic-anchor">
            <a href=text>
              <img class="avatar" src=(?<头像URL> text ) />
            </a>
            <a href=(?<链接> text )> (?<名称> text ) </a>
          </div>)
          (?<帖子信息>
          <div class="topic-title">
            <a class="user-title" href=(?<链接> text )>
              (?<标题> text )
            </a>
            <div class="topic-meta">
              (?<点击数> text ) "点击 / "
              (?<发布时间> text ) "发布 / "
              (?<最新回复时间> text ) "回复"
            </div>
          </div>
          <div class="topic-reply-count">
            <a href=text> (?<回复数> text ) </a>
          </div>
          (?<板块信息>
          <div class="topic-forum-name">
            <a class="topic-title" href=(?<链接> text) >
              (?<名称> text )
            </a>
          </div>))
        </li> +  <!-- 至少一个帖子 -->
      </ul>)
    </any**>
  </div>
  <any** any*/>  <!-- 不关心后续节点 -->
</body>
$  <!-- 匹配结尾 -->

捕获结果:

[
  {
    "用户信息": {
      "头像URL": "https://file.hu60.cn/avatar/19011.jpg?r=1652530427",
      "链接": "https://hu60.cn/q.php/user.info.19011.html",
      "名称": "花祭"
    },
    "帖子信息": {
      "链接": "https://hu60.cn/q.php/bbs.topic.105334.html",
      "标题": "我这5g这么慢",
      "点击数": "160",
      "发布时间": "08-31 08:15",
      "最新回复时间": "11分钟前",
      "回复数": "12"
    },
    "板块信息": {
      "链接": "https://hu60.cn/q.php/bbs.forum.88.html",
      "名称": "超级灌水"
    }
  },
  {
    "用户信息": {
      "头像URL": "https://file.hu60.cn/avatar/24826.jpg?r=1692886310",
      "链接": "https://hu60.cn/q.php/user.info.24826.html",
      "名称": "咯叽"
    },
    "帖子信息": {
      "链接": "https://hu60.cn/q.php/bbs.topic.105341.html",
      "标题": "qq浏览器有何神奇之处?",
      "点击数": "10",
      "发布时间": "1小时前",
      "最新回复时间": "45分钟前",
      "回复数": "4"
    },
    "板块信息": {
      "链接": "https://hu60.cn/q.php/bbs.forum.88.html",
      "名称": "超级灌水"
    }
  },
  "……省略剩余 18 个帖子信息……"
]

2. 如何自动抽取总结共有结构呢?

比如,有些帖子有 [公开] 标签,能不能自动识别加上呢?

<div class="topic-meta">
    (?<点击数> text ) "点击 / "
    (?<发布时间> text ) "发布 / "
    (?<最新回复时间> text ) "回复"
    <div class="topic-status">"公开"</div> ?  <!-- 自动备注:出现了 4 / 20 次 -->
</div>
回复列表(11|隐藏机器人聊天)
添加新回复
回复需要登录