سؤال

هل هناك أي طريقة تقسيم سلسلة طويلة من HTML بعد ن الكلمات ؟ ومن الواضح أن أتمكن من استخدام:

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

للحصول على أول ن كلام عادي سلسلة نصية, ولكن هذا قد انقسم في منتصف علامة html و لن تنتج html صالحة لأن ذلك لن بالقرب من العلامات التي تم فتحها.

أنا بحاجة للقيام بذلك في zope / بلون الموقع - إذا كان هناك شيء القياسية في تلك المنتجات التي يمكن أن تفعل ذلك ، من شأنه أن يكون مثاليا.

على سبيل المثال ، يقول علي النص:

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

وأنا أطلب إلى انقسام بعد 5 كلمات ، ينبغي العودة:

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

7 الكلمات:

<p>This is some text with a 
  <a href="http://www.example.com/" title="Example link">
     bit
  </a>
</p>
هل كانت مفيدة؟

المحلول

ونلقي نظرة على truncate_html_words وظيفة في django.utils.text. حتى لو كنت لا تستخدم جانغو، رمز هناك يفعل بالضبط ما تريد.

نصائح أخرى

ولقد سمعت أن جميل حساء هو جيد جدا في تحليل أتش تي أم أل. ومن المرجح أن تكون قادرة على مساعدتك في الحصول على أتش تي أم أل الصحيح للخروج.

وكنت ذاهبا لنذكر قاعدة HTMLParser أن الذي بني في بيثون، لأنني لست متأكدا ما نهاية ينتج لديك في محاولة للوصول الى غير ذلك، قد أو قد لا تحصل هناك، عليك أن تعمل مع معالجات في المقام الأول

يمكنك استخدام مزيج من regex, BeautifulSoup أو مرتبة (أنا أفضل BeautifulSoup).الفكرة بسيطة - غزة كل علامات HTML الأولى.العثور على الألف في كلمة (ن=7 هنا), تجد عدد مرات أقصى تظهر الكلمة في السلسلة حتى ن الكلمات - coz u تبحث فقط عن وقوع الماضي لاستخدامها في الاقتطاع.

هنا هو قطعة من التعليمات البرمجية ، على الرغم قليلا فوضوي ولكن يعمل

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)

الإخراج هو ما اردت

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>

ويساعد هذا الأمل

تحرير: أفضل regex

`p = re.compile(r'<[^<]*?>')`
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top