Split HTML nach N Worte in Python
Frage
Gibt es eine Möglichkeit, eine lange Reihe von HTML nach N zur Trennung von Worten? Offensichtlich konnte ich verwenden:
' '.join(foo.split(' ')[:n])
die ersten n Worte eines einfachen Text-String zu bekommen, aber das in der Mitte eines HTML-Tages aufgeteilt kann und wird nicht gültig html produzieren, weil es nicht die Tags schließen, die geöffnet wurden.
Ich brauche dies in einer Zope / Plone-Site zu tun - wenn es etwas wie Standard in diesen Produkten, die es tun können, das wäre ideal
.Zum Beispiel, sagen, ich habe den Text:
<p>This is some text with a
<a href="http://www.example.com/" title="Example link">
bit of linked text in it
</a>.
</p>
Und ich frage sie nach 5 zur Trennung von Worten, es sollte zurückgeben:
<p>This is some text with</p>
7 Worte:
<p>This is some text with a
<a href="http://www.example.com/" title="Example link">
bit
</a>
</p>
Lösung
Werfen Sie einen Blick auf die truncate_html_words Funktion in django.utils.text. Auch wenn Sie nicht Django verwenden, der Code es tut genau das, was Sie wollen.
Andere Tipps
Ich habe gehört, dass Schöne Suppe ist sehr gut bei der HTML-Analyse. Es wird wahrscheinlich in der Lage sein, Sie korrekten html erhalten zu helfen.
Ich wollte die Basis erwähnen HTMLParser dass gebaut ist in Python, da ich bin nicht sicher, was das Endergebnis Ihre versuchen, zu bekommen, kann es oder nicht, dass Sie es bekommen können, werden Sie mit den Handler arbeiten in erster Linie
Sie können eine Mischung aus regex, BeautifulSoup verwenden oder Tidy (ich ziehe BeautifulSoup). Die Idee ist einfach - Streifen alle HTML-Tags zuerst. Finden Sie das n-te Wort (n = 7) Hier finden Sie die Anzahl der Male, das n-te Wort erscheint in der Zeichenfolge bis n Worte -. Coz u sucht nur nach dem letzten Vorkommen zu Trunkierungsmöglichkeiten verwendet wird
Hier ist ein Stück Code, wenn auch ein wenig chaotisch, aber funktioniert
import re
from BeautifulSoup import BeautifulSoup
import tidy
def remove_html_tags(data):
p = re.compile(r'<.*?>')
return p.sub('', data)
input_string='<p>This is some text with a <a href="http://www.example.com/" '\
'title="Example link">bit of linked text in it</a></p>'
s=remove_html_tags(input_string).split(' ')[:7]
###required to ensure that only the last occurrence of the nth word is
# taken into account for truncating.
# coz if the nth word could be 'a'/'and'/'is'....etc
# which may occur multiple times within n words
temp=input_string
k=s.count(s[-1])
i=1
j=0
while i<=k:
j+=temp.find(s[-1])
temp=temp[j+len(s[-1]):]
i+=1
####
output_string=input_string[:j+len(s[-1])]
print "\nBeautifulSoup\n", BeautifulSoup(output_string)
print "\nTidy\n", tidy.parseString(output_string)
Die Ausgabe ist, was u wollen
BeautifulSoup
<p>This is some text with a <a href="http://www.example.com/" title="Example link">bit</a></p>
Tidy
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta name="generator" content=
"HTML Tidy for Linux/x86 (vers 6 November 2007), see www.w3.org">
<title></title>
</head>
<body>
<p>This is some text with a <a href="http://www.example.com/"
title="Example link">bit</a></p>
</body>
</html>
Hope, das hilft
Edit: Eine bessere regex
`p = re.compile(r'<[^<]*?>')`