Question

Est-il possible de diviser une longue chaîne de HTML après N mots? Il est évident que je pourrais utiliser:

' '.join(foo.split(' ')[:n])

pour obtenir les premiers mots de n d'une chaîne de texte brut, mais qui pourrait diviser au milieu d'une balise html, et ne produira pas html valide car il ne fermera pas les balises qui ont été ouvertes.

Je dois faire cela dans un site Zope / Plone - s'il y a quelque chose en standard dans ces produits qui peuvent le faire, ce serait l'idéal

.

Par exemple, dire que j'ai le texte:

<p>This is some text with a 
  <a href="http://www.example.com/" title="Example link">
     bit of linked text in it
  </a>.
</p>

Et je demande à diviser après 5 mots, il doit revenir:

<p>This is some text with</p>

7 mots:

<p>This is some text with a 
  <a href="http://www.example.com/" title="Example link">
     bit
  </a>
</p>
Était-ce utile?

La solution

Jetez un oeil à la truncate_html_words fonction django.utils.text. Même si vous ne l'utilisez Django, le code, il fait exactement ce que vous voulez.

Autres conseils

Je l'ai entendu dire que Belle soupe est très bon à l'analyse syntaxique html. Il sera probablement en mesure de vous aider à obtenir le code HTML correspondant à.

J'allais mentionner la base HTMLParser qui est construit en Python, puisque je ne suis pas sûr de ce que le résultat final que vous essayez de se rendre à est, il peut ou ne peut pas vous arriver, vous travaillerez avec les gestionnaires principalement

Vous pouvez utiliser un mélange de regex, BeautifulSoup ou Tidy (je préfère BeautifulSoup). L'idée est simple - dépouiller toutes les balises HTML premier. Trouver le n-ième mot (n = 7 ici), trouver le nombre de fois que le nième mot apparaît dans la chaîne jusqu'à n mots -. Coz u sont à la recherche que pour la dernière occurrence à utiliser pour tronquer

Voici un morceau de code, mais un peu compliqué, mais fonctionne

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)

La sortie est ce que tu veux

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 this helps

Modifier Une meilleure regex

`p = re.compile(r'<[^<]*?>')`
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top