보통 웹페이지를 열면 기사 본문 외에도 네비게이션, 광고, 기타 정보가 많이 나오는 경우가 많습니다. 이 블로그의 목적은 웹 페이지에서 기사의 텍스트 콘텐츠를 추출하고 기타 관련 없는 정보를 전환하는 방법을 설명하는 것입니다.
이 방법은 텍스트 밀도를 기반으로 합니다. 원래 아이디어는 하얼빈 공과대학의 "라인 블록 분포 기능 기반 일반 웹 페이지 텍스트 추출 알고리즘"에서 나왔습니다. 이 기사에서는 이를 기반으로 몇 가지 수정을 가했습니다.
규칙:
이 글은 웹페이지의 여러 행을 기준으로 통계를 작성하므로 웹페이지 내용이 압축되지 않은 것으로 가정합니다. 웹페이지에 정상적인 줄바꿈이 있습니다.
일부 뉴스 웹페이지에는 텍스트 내용이 더 짧을 수 있지만 여기에는 동영상 파일이 포함되어 있습니다. 따라서 사진에도 똑같이 적용되는 단점이 있습니다. 가중치는 이미지 표시 크기에 따라 결정되지만 이 기사의 방법은 이를 달성하지 못합니다.
광고 및 탐색으로 인해 이러한 텍스트가 아닌 콘텐츠는 일반적으로 하이퍼링크 형식으로 나타나므로 텍스트는 하이퍼링크 텍스트에 아무런 가중치를 두지 않습니다.
여기서는 텍스트의 내용이 연속적이며 텍스트가 아닌 내용을 포함하지 않는다고 가정합니다. 따라서 실제로 텍스트 내용을 추출한다는 것은 텍스트 내용의 시작과 끝을 찾는 것입니다.
단계:
먼저 CSS, JavaScript, Note, Meta, INS 등의 내용을 지웁니다. 각 줄의 처리값 계산(1) 위에서 구한 줄당 텍스트 수의 최대 양수 하위 문자열의 시작 위치와 끝 위치 계산
두 번째 단계를 설명해야 합니다. 각 줄에 대해 값을 계산해야 합니다. 이미지 태그 img. 길이는 50에 해당합니다. 문자의 텍스트(주어진 가중치)는 x1, 비디오 태그 삽입은 길이가 1000자인 텍스트, x2에 해당합니다. 한 줄에 연결된 모든 태그 a의 텍스트 길이 x3 , 다른 태그의 텍스트 길이 x4 각 줄의 값 = 50 * x1 발생 횟수 + 1000 * x2 해당 횟수 ofoccurrences + x4 – 8 //Explanation , -8 최대 양수 부분 문자열을 계산해야 하기 때문에 이 숫자가 얼마나 커야 하는지는 양수를 빼야 한다고 생각합니다. 경험을 바탕으로 작성합니다. 전체 코드
#coding:utf-8 import re def remove_js_css (content): """ remove the the javascript and the stylesheet and the comment content (<script>....</script> and <style>....</style> <!-- xxx -->) """ r = re.compile(r'''<script.*?</script>''',re.I|re.M|re.S) s = r.sub ('',content) r = re.compile(r'''<style.*?</style>''',re.I|re.M|re.S) s = r.sub ('', s) r = re.compile(r'''<!--.*?-->''', re.I|re.M|re.S) s = r.sub('',s) r = re.compile(r'''<meta.*?>''', re.I|re.M|re.S) s = r.sub('',s) r = re.compile(r'''<ins.*?</ins>''', re.I|re.M|re.S) s = r.sub('',s) return s def remove_empty_line (content): """remove multi space """ r = re.compile(r'''^\s+$''', re.M|re.S) s = r.sub ('', content) r = re.compile(r'''\n+''',re.M|re.S) s = r.sub('\n',s) return s def remove_any_tag (s): s = re.sub(r'''<[^>]+>''','',s) return s.strip() def remove_any_tag_but_a (s): text = re.findall (r'''<a[^r][^>]*>(.*?)</a>''',s,re.I|re.S|re.S) text_b = remove_any_tag (s) return len(''.join(text)),len(text_b) def remove_image (s,n=50): image = 'a' * n r = re.compile (r'''<img.*?>''',re.I|re.M|re.S) s = r.sub(image,s) return s def remove_video (s,n=1000): video = 'a' * n r = re.compile (r'''<embed.*?>''',re.I|re.M|re.S) s = r.sub(video,s) return s def sum_max (values): cur_max = values[0] glo_max = -999999 left,right = 0,0 for index,value in enumerate (values): cur_max += value if (cur_max > glo_max) : glo_max = cur_max right = index elif (cur_max < 0): cur_max = 0 for i in range(right, -1, -1): glo_max -= values[i] if abs(glo_max < 0.00001): left = i break return left,right+1 def method_1 (content, k=1): if not content: return None,None,None,None tmp = content.split('\n') group_value = [] for i in range(0,len(tmp),k): group = '\n'.join(tmp[i:i+k]) group = remove_image (group) group = remove_video (group) text_a,text_b= remove_any_tag_but_a (group) temp = (text_b - text_a) - 8 group_value.append (temp) left,right = sum_max (group_value) return left,right, len('\n'.join(tmp[:left])), len ('\n'.join(tmp[:right])) def extract (content): content = remove_empty_line(remove_js_css(content)) left,right,x,y = method_1 (content) return '\n'.join(content.split('\n')[left:right])코드는 마지막 함수부터 호출됩니다.