我需要为有效的网址处理大量文字。
输入是模糊的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 /命令行会很好。
答案 0 :(得分:2)
我将一些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
推送生成的文件以删除重复的条目,但我不想在最后将其串起来,因为它会增加另一层复杂性,我很确定sort会尝试缓冲整个文件,这可能会导致崩溃。
无论如何,因为它现在正在运行,看起来它需要大约40分钟。我之前不知道pv
。这是一个非常酷的实用工具!
答案 1 :(得分:0)
我认为你走在正确的轨道上,grep
应该能够处理5Gb文件。尝试简化正则表达式,避免使用|
运算符和许多括号。此外,使用head
命令在针对整个文件运行之前获取前100Kb,并使用管道链接greps以实现更高的特异性。例如,
head -c 100000 myFile | grep -E "((src)|(href))\b*=\b*[\"'][\w://\.]+[\"']"
那应该超级快,不是吗?