【问题标题】:Extracting URLs from large text/HTML files从大型文本/HTML 文件中提取 URL
【发布时间】:2012-02-25 21:23:30
【问题描述】:

我需要为有效的 URL 处理大量文本。

输入是模糊的 HTMLish,因为它主要是 html。然而,它并不是真正的有效 HTML。

我*一直在尝试使用正则表达式,但遇到了问题。

在您说(或可能尖叫 - 我已阅读其他 HTML + 正则表达式问题)“使用解析器”之前,您需要考虑一件事:
我正在使用的文件大小约为 5 GB

我不知道任何解析器可以在不失败或花费数天的情况下处理它。此外,虽然文本内容是大部分 html,但不一定是有效 html,这意味着它需要一个非常宽容的解析器。最后,并非所有链接都必须在<a> 标签中(有些可能只是纯文本)。

鉴于我并不真正关心文档结构,有没有更好的替代方法 WRT 提取链接?

现在我正在使用正则表达式:
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))(在 grep -E 中)
但即便如此,我还是在让它运行了大约 3 个小时后就放弃了。

Regex 引擎的性能是否存在显着差异?我正在使用 MacOS 的命令行grep。如果有其他性能更好的兼容实现,那可能是一种选择。


我不太关心语言/平台,尽管 MacOS/命令行会很好。

【问题讨论】:

  • 它应该在没有计划的情况下捕获东西吗? (即没有http://
  • @icktoofay - 那太好了。

标签: html regex large-files


【解决方案1】:

我将几个 grep 命令串在一起:

pv -cN source allContent | grep -oP "(?:\"([^\"' ]*?)\")|(?:'([^\"' ]*?)')|(?:([^\"' ]*?) )" | grep -E "(http)|(www)|(\.com)|(\.net)|(\.to)|(\.cc)|(\.info)|(\.org)" | pv -cN out > extrLinks1

我使用pv 给我一个进度指示器。

grep -oP "(?:\"([^\"' ]*?)\")|(?:'([^\"' ]*?)')|(?:([^\"' ]*?) )"
拉出任何看起来像单词或引用文本的内容,并且没有空格。

grep -E "(http)|(www)|(\.com)|(\.net)|(\.to)|(\.cc)|(\.info)|(\.org)"
过滤任何看起来可能是 URL 的输出。

最后,
pv -cN out > extrLinks1
将其输出到文件中,并提供一个不错的活动表。

我可能会通过sort -u 推送生成的文件以删除重复的条目,但我不想在最后将其串起来,因为它会增加另一层复杂性,我很确定排序会尝试缓冲整个文件,这可能会导致崩溃。


无论如何,由于它现在正在运行,看起来需要大约 40 分钟。我以前不知道pv。这是一个非常酷的实用程序!

【讨论】:

    【解决方案2】:

    我认为你在正确的轨道上,grep 应该能够处理 5Gb 文件。尝试简化您的正则表达式,避免使用 | 运算符和这么多括号。此外,在对整个文件运行之前,使用head 命令获取前 100Kb,并使用管道链接 grep 以实现更高的特异性。例如,

    head -c 100000 myFile | grep -E "((src)|(href))\b*=\b*[\"'][\w://\.]+[\"']"
    

    那应该超级快吧?

    【讨论】:

    • 我也在寻找不在<a> 标签中的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多