سؤال

أحاول استخدام هتمل 5ليب.المطهر لتنظيف المستخدم المدخلات كما هو مقترح في المستندات

المشكلة هي أنني أريد إزالة العلامات السيئة تماما وليس فقط الهروب منها (والتي تبدو فكرة سيئة على أي حال).

الحل البديل المقترح في التصحيح هنا لا يعمل كما هو متوقع (يحافظ على المحتوى الداخلي ل <tag>content</tag>).

على وجه التحديد ، أريد أن أفعل شيئا من هذا القبيل:

المدخلات:

<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world</h1>
Lorem ipsum

الناتج:

<h1>Hello world</h1>
Lorem ipsum

أي أفكار حول كيفية تحقيق ذلك?لقد حاولت بوتيفولسوب ، ولكن لا يبدو أن تعمل بشكل جيد ، وإدراج شمل <p></p> العلامات في أماكن غريبة جدا (على سبيل المثال .حول سرك أترس).حتى الآن ، يبدو أن هتمل 5ليب هو أفضل شيء لهذا الغرض ، إذا كان بإمكاني فقط الحصول عليه لإزالة العلامات بدلا من الهروب منها.

هل كانت مفيدة؟

المحلول

التحدي هو أيضا تجريد العلامات المتداخلة غير المرغوب فيها.إنها ليست جميلة ولكنها خطوة في الاتجاه الصحيح:

from lxml.html import fromstring
from lxml import etree

html = '''
<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world<script>bad_thing();</script></h1>
Lorem ipsum
<script>bad_thing();</script>
<b>Bold Text</b>
'''

l = []
doc = fromstring(html)
for el in doc.xpath(".//h1|.//b"):
    i = etree.Element(el.tag)
    i.text, i.tail = el.text, el.tail
    l.append(etree.tostring(i))

print ''.join(l)

أي النواتج:

<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top