使用 Haskell 从 HTML 中提取 body

Extracting body from HTML with Haskell

Haskell新手看过来!

我正在尝试解析 HTML String and extract the body from it. I'm using GHC Version 9.0.2 . I've tried to extract it using Regex. I'm using Text.Regex.TDFA (Version 1.3.1.2). I've checked the functionality of my Regex at regex101.com. Based on this I've modified it to be in line with POSIX Extended Regular Expressions. But for some reason my code(第 51 行)仍然无法匹配 HTML 的 body。

所以我的问题是为什么会发生这种情况以及如何解决?或者有更好/更简单的 HTML body 提取方法吗?

提前谢谢大家。

你快到了。

  • <body.*>太贪了
  • ([\w|\W]) 不需要字符集内的管道并且缺少量词
  • <\/body> 可以

你需要这个:

<body.*?>([\w\W]*)<\/body>

https://regex101.com/r/9rVCUQ/1


每个人都会想告诉您,您不应该 parse/extract html 使用正则表达式。使用 html 解析库以获得更可靠的结果。

不要使用正则表达式捕获HTML。 HTML 是一个 context-free language [wiki], a regex can (often) only parser regular languages [wiki],因此无法捕获 HTML。即使对于一个(非常)具体的问题,它可以用一个正则表达式来完成,它会导致一个难以编写、验证和错误修复的繁琐的正则表达式。

Haskell 有一个名为 scalpel [hackage] 的库,它在解析 HTML 时非常有效。例如,您可以提取 <body> 标签中的 HTML:

{-# LANGUAGE OverloadedStrings #-}

import Text.HTML.Scalpel(innerHTML, scrapeStringLike)

<strong>scrapeStringLike</strong> myHtml (<strong>innerHTML</strong> "body")

myHtml包含页面HTML的字符串。您可能想要更高级的抓取,并且 scalpel 允许定义一个抓取器层次结构,每个抓取器执行一个小任务来构建一个高级解析器。