Normalerweise gibt es beim Öffnen einer Webseite neben dem Haupttext des Artikels auch viele Navigationselemente, Werbung und andere Informationen. Der Zweck dieses Blogs besteht darin, zu erklären, wie man den Textinhalt eines Artikels aus einer Webseite extrahiert und andere irrelevante Informationen entfernt.
Diese Methode basiert auf der Textdichte. Die ursprüngliche Idee stammt vom „General Web Page Text Extraction Algorithm Based on Line Block Distribution Function“ des Harbin Institute of Technology.
Konvention:
Dieser Artikel erstellt Statistiken basierend auf verschiedenen Zeilen der Webseite. Daher wird davon ausgegangen, dass der Webseiteninhalt nicht komprimiert ist, d. h. Die Webseite hat normale Zeilenumbrüche.
Einige Nachrichten-Webseiten haben möglicherweise kürzere Textinhalte, aber eine Videodatei ist darin eingebettet. Das Gleiche gilt hier für Bilder Das Gewicht wird anhand der Größe der Bildanzeige bestimmt, die Methode in diesem Artikel kann dies jedoch nicht erreichen.
Aufgrund von Werbung und Navigation erscheinen diese Nicht-Text-Inhalte normalerweise in Form von Hyperlinks, sodass der Text dem Text des Hyperlinks keine Bedeutung beimisst.
Hier wird davon ausgegangen, dass der Inhalt des Textes fortlaufend ist und keinen Nicht-Text-Inhalt enthält. Daher besteht das Extrahieren des Textinhalts tatsächlich darin, den Anfang und das Ende des Textinhalts zu finden.
Schritt:
Löschen Sie zunächst den Inhalt von CSS, JavaScript, Notiz, Meta, INS usw. Berechnen Sie den verarbeiteten Wert jeder Zeile (1) Berechnen Sie die Start- und Endposition der maximalen positiven Teilzeichenfolge der oben erhaltenen Anzahl von Texten pro Zeile
Der zweite Schritt muss erklärt werden: Für jede Zeile müssen wir einen Wert berechnen. Die Berechnung dieses Werts ist wie folgt: Ein Bild-Tag img, das entspricht einer Länge von 50. Der Text des Zeichens (die angegebene Gewichtung), x1, Eine Video-Tag-Einbettung entspricht einem Text mit einer Länge von 1000 Zeichen, x2 Der Textlänge aller verknüpften Tags a in einer Zeile x3 , Die Textlänge anderer Tags x4 Der Wert jeder Zeile = 50 * x1 ihre Anzahl der Vorkommen + 1000 * x2 ihre Anzahl Anzahl der Vorkommen + x4 – 8 //Erläuterung , -8 Da wir eine maximale positive Teilzeichenfolge berechnen müssen, müssen wir eine positive Zahl subtrahieren. Ich denke, sie basiert darauf, wie groß diese Zahl sein sollte auf Erfahrung. Vollständiger Code
#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])