اذهب إلى المحتوى

السؤال

نشر

أثناء استخلاص بعض البيانات من مواقع الويب، يكون هناك بعض الوسوم الفارغة، على سبيل المثال كما في المستند التالي:

<p>
<p></p>
<strong>some<br>text<br>here</strong></p>

لذا كيف يمكنني معالجة هكذا حالات؟ أو بمعنى آخر كيف يمكننا حذف هذه الوسوم؟
 

Recommended Posts

  • 1
نشر

يمكنك القيام بذلك بالشكل التالي:

# استيراد الوحدات اللازمة
from bs4 import BeautifulSoup
# المستند الخاص بك
htmlDoc = """
<p>
<p></p>
<strong>some<br>text<br>here</strong></p>
"""
# BeautifulSoup تحليل النص الذي تم الحصول عليه من خلال 
soup = BeautifulSoup(htmlDoc, 'lxml')
# الآن نقوم بالمرور على كل الوسوم
for x in soup.find_all():
	# نقوم بجلب النص من الوسم وإزالة المسافات الفارغة 
	# وبعد محو المسافات الفارغة نتحقق فيما إذا كان طوله يساوي 0
  # في حالة أصبح طوله 0 نقوم بحذف الوسم
  if len(x.get_text(strip=True)) == 0:		 
  		x.extract()
# طباعة النتيجة
print(soup)
/*
<html><body>
<strong>sometexthere</strong>
</body></html>
*/

 

  • 1
نشر

تستطيع تحديد ما إذا كان العنصر فارغًا أم لا من خلال الخاصية contents الخاصة به، وبالتالي يمكننا المرور على كل عناصر الصفحة عبر التابع find_all والتحقق مما إذا كان العنصر فارغ أم لا:
 

def checkEmpty(tag):
  return not tag.contents and not tag.name == 'br'

# يقبل التابع find_all تمرير دالة له
[tag.decompose() for tag in soup.find_all(checkEmpty)]

لكن إن أحتوى العنصر على بعض المسافات فسوف يتم تخطيه ولن يتم حذف، لذلك يمكن أن نغير في الكود السابق ليتم حذف العناصر التي تحتوي على مسافات فقط في داخلها:

from bs4 import BeautifulSoup

content = """
<p>
<p></p>
<strong>some<br>text<br>here</strong>
</p>
"""
soup = BeautifulSoup(content, features='lxml')


def checkEmpty(tag):
    return (not tag.contents or len(tag.get_text(strip=True)) <= 0) and not tag.name == 'br'

# إزالة كل العناصر الفارغة
[tag.decompose() for tag in soup.find_all(checkEmpty)]

print(soup)

"""
<html><body>
<strong>some<br/>text<br/>here</strong>
</body></html>
"""

لاحظ أن عنصر p لا يجوز أن يحتوي على عنصر p آخر في داخله، لذلك تقوم مكتبة BeautifulSoup بإغلاق العناصر تلقائيَا،و يتم تحويل المستند إلى هذا الشكل:
 

<html><body><p>
</p><p></p>
<strong>some<br/>text<br/>here</strong>
</body></html>

وبالتالي سيتم حذف العنصر p الأول والثاني وسيتبقى فقط العنصر strong داخل جسم الصفحة

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...