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>
War es hilfreich?

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'<[^<]*?>')`
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top