2012-02-11 4 views
5

유효한 URL을 처리하는 데 필요한 텍스트가 많습니다.대용량 텍스트/HTML 파일에서 URL 추출

입력이 막연하게 HTMLish인데, 대부분 HTML입니다. 그러나 실제로는 유효 HTML이 아닙니다.

저는 정규식으로 문제를 일으키려고했습니다. 내가 함께 일하고 파일이
을 "는 파서을 사용하여"한 가지 고려해야 할 필요가있다 -

당신은 (나는 다른 HTML + 정규식 질문에 읽은 비명 또는 가능하게) 말을하기 전에 약 5GB 크기

필자는 실패하지 않고, 또는 며칠을 다룰 수있는 파서를 모른다. 또한, 텍스트 내용이 , 주로 html이지만, 반드시 유효한 html이라는 것은 매우 관대 한 파서가 필요하다는 것을 의미합니다. 마지막으로 모든 링크가 반드시 <a> 태그 (일부는 일반 텍스트 일 ​​수 있음)에 있어야합니다.

내가 문서 구조에 대해별로 신경 쓰지 않는다면 WRT에서 링크를 추출하는 더 좋은 대안이 있습니까?

가 지금 내가 정규식을 사용하고 있습니다 :
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))) (그렙 -E에서)
하지만 심지어와 함께, 나는 약 3 시간 동안 실행시키는 후 포기했다.

Regex 엔진 성능에 중요한 차이가 있습니까? MacOS의 명령 행 grep을 사용하고 있습니다. 성능이 좋은 다른 호환 구현이있는 경우 옵션 일 수 있습니다.


MacOS/명령 줄이 좋지만 언어/플랫폼에 대해서는별로 신경 쓰지 않습니다.

+0

계획없이 물건을 잡아야합니까? (즉, 'http : //'는 아님) – icktoofay

+0

@icktoofay - 좋을 것 같습니다. –

답변

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을 통해 푸시 할 것입니다.하지만 다른 계층의 복잡성이 추가 될 것이기 때문에 결국 문자열을 사용하고 싶지는 않습니다. 전체 파일을 버퍼링하여 충돌을 일으킬 수 있습니다.


어쨌든, 현재 실행 중이므로 약 40 분 정도 걸리는 것으로 보입니다. 전에 pv에 대해 몰랐습니다. 정말 멋진 유틸리티입니다!

0

나는 올바른 길을 가고 있으며 grep은 5Gb 파일을 처리 할 수 ​​있어야한다고 생각합니다. 정규 표현식을 단순화하여 | 연산자와 너무 많은 괄호를 사용하지 마십시오. 또한 head 명령을 사용하여 전체 파일에 대해 실행하기 전에 첫 번째 100Kb를 가져온 다음 파이프를 사용하여 greps를 체인화하여보다 구체화하십시오. 예 :

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

매우 빠르지 만 안타깝습니다.