انتقل إلى المحتوى

ما هي بعض بدائل BeautifulSoup لتحليل HTML في بايثون؟

باعتبارك أحد مطوري Python، ربما تكون على دراية بـ BeautifulSoup (المعروف أيضًا باسم BS4) - مكتبة تحليل HTML/XML الموقرة والتي كانت عنصرًا أساسيًا في استخراج الويب من Python لأكثر من عقد من الزمان.

لكن ربما لا تعلم أن Beautiful Soup ليس الخيار الوحيد لتحليل HTML في Python في الوقت الحاضر. في الواقع، هناك عدد مذهل من بدائل BeautifulSoup القادرة والتي تفوق في بعض الحالات BS4 من حيث الوظائف والأداء.

في هذا الدليل الشامل، سوف نستكشف بعضًا من بدائل BeautifulSoup الأكثر شهرة وقوة لاستخلاص HTML وتحليله باستخدام Python.

لماذا تفكر في بدائل BeautifulSoup؟

قبل الغوص في الخيارات، قد تتساءل – لماذا تفكر في البدائل في المقام الأول؟

فيما يلي بعض الأسباب التي قد تدفعك إلى النظر إلى ما هو أبعد من BeautifulSoup لمشاريع تجريف الويب الخاصة بـ Python:

  • أداء أفضل – يتفوق بعض المحللين الأحدث بشكل ملحوظ على BS4 في المعايير. السرعة أمر بالغ الأهمية عند تجريف المواقع الكبيرة.

  • المزيد من المزايا – توفر المكتبات مثل lxml إمكانات إضافية مثل دعم XPath.

  • تحليل HTML5 أفضل - قد يواجه موقع BeautifulSoup أحيانًا مشكلة مع لغة HTML الحديثة والتالفة.

  • واجهات برمجة التطبيقات (APIs) أسهل - توفر المكتبات مثل parsel واجهات برمجة التطبيقات Pythonic الأكثر سهولة.

  • خيوط المعالجة المتعددة - تسمح بعض الموزعات البديلة بالتحليل متعدد الخيوط للاستفادة من مراكز وحدة المعالجة المركزية المتعددة.

  • الامتثال للمعايير - قد تحتاج إلى محلل يتبع مواصفات HTML بدقة.

  • تركيب أسهل - يحتوي BS4 على بعض تبعيات C التي يمكن أن تسبب مشكلات في التثبيت، خاصة على الأنظمة المقيدة مثل AWS Lambda. يمكن نشر البدائل التي تحتوي على كود Python النقي بشكل أسهل.

لذا، في حين يظل BS4 خيارًا جيدًا، فإن الخيارات الممتازة الأخرى تستحق اهتمامك. دعونا نلقي نظرة على بعض من أفضل بدائل BeautifulSoup لتحليل HTML وتجميع الويب في بايثون!

lxml – سريع كالبرق

أحد بدائل BeautifulSoup الأكثر شعبية وقوة هو com.lxml. توفر مكتبة lxml واجهة برمجة تطبيقات سريعة للغاية وغنية بالميزات لتحليل HTML وXML باستخدام Python.

في المعايير، يتفوق lxml باستمرار على BeautifulSoup بهوامش كبيرة. ليس من غير المألوف أن نرى تحسينات في السرعة بمقدار 10-100x عند استخدام lxml لتحليل HTML بدلاً من BeautifulSoup.

وهذا يجعل من lxml أداة أساسية لأي شخص يقوم بمسح المواقع الكبيرة أو تحليل مستندات HTML الضخمة. تسمح لك مزايا السرعة بتحليل العلامات بشكل أكثر كفاءة وتكاليف أقل للتجريف المترابط بشكل كبير.

بعض المزايا الرئيسية لـ lxml:

  • سرعة تحليل XML وHTML مذهلة
  • دعم المستندات الكبيرة جدًا
  • دعم XPath 1.0 للاستعلام المتطور
  • دعم محدد CSS مشابه لـ BeautifulSoup
  • ترابط أسهل - يقوم lxml بإصدار GIL لذلك يسمح بالتحليل متعدد الخيوط
  • دعم تحليل HTML5

دعنا نستعرض مثالًا سريعًا لرؤية تطبيق lxml أثناء العمل:

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

يوضح هذا المثال البسيط سرعة lxml - حيث يمكنه تحليل صفحة ويكيبيديا كاملة والاستعلام عنها في أجزاء من الثانية!

بعض الجوانب السلبية التي يجب مراعاتها حول lxml:

  • منحنى التعلم أصعب من BeautifulSoup. يحتوي استعلام XPath على منحنى تعليمي أكثر حدة من محددات CSS.
  • لا يوجد كشف ترميز مدمج مثل BS4.
  • لا يوجد تمثيل كائن بايثون لعناصر مثل BS4. تتم المعالجة من خلال واجهات برمجة تطبيقات التنقل في DOM.

ومع ذلك، بالنسبة لمعظم عمليات تجريف الويب الخاصة بالإنتاج، يعد lxml جزءًا أساسيًا من مجموعة أدواتك. تتيح لك مكاسب السرعة استخراج المزيد من البيانات بكفاءة أكبر.

بارسيل - lxml، مبسط

إذا أعجبك ما يقدمه lxml لكن تجد أن واجهة برمجة التطبيقات (API) معقدة للغاية، قم بفحصه جزء.

يوفر Parsel واجهة برمجة تطبيقات Pythonic أسهل في الاستخدام عن طريق تغليف lxml وتوفير واجهة قائمة على المحدد لاستخراج البيانات من HTML/XML.

الميزة الرئيسية للparsel هي البساطة وسهولة القراءة. تم تصميم Parsel من الألف إلى الياء مع أخذ تجريف الويب في الاعتبار، بينما يدعم lxml نطاقًا أوسع بكثير من وظائف تحليل XML.

مقارنة بـ lxml، يقدم parsel:

  • تعبيرات محدد CSS المبسطة
  • التعامل مع الترميز التلقائي
  • أسهل بكثير لواجهات برمجة التطبيقات الخاصة بالسمات واستخراج النص
  • نهج أكثر بديهية بشكل عام

على سبيل المثال، إليك كيفية استخراج النص والسمات باستخدام محددات Parsel:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/ar/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

ستكون واجهة برمجة التطبيقات TheSelector مألوفة جدًا لأي شخص يأتي من BeautifulSoup أو jQuery. لكنك تحصل على جميع مزايا أداء lxml تحت الغطاء!

يعد Parsel بشكل عام خيارًا ممتازًا عندما تريد واجهة تجريف بسيطة وبديهية ولكن لا تريد التضحية بمزايا السرعة أو التوافق الخاصة بـ lxml.

html5lib - التحليل المتوافق مع المعايير

أحد أروع بدائل BeautifulSoup هو html5lib.

يعد html5lib فريدًا لأنه يقوم بتحليل HTML بنفس الطريقة التي يقوم بها متصفح الويب الحديث. إنه يتعامل مع مواصفات HTML بدقة ويخرج نموذج كائن مستند يلتزم بشكل وثيق بمواصفات W3C DOM الرسمية.

تشمل مزايا html5lib ما يلي:

  • تحليل HTML صادق ومتوافق وفقًا لقواعد متصفح HTML5
  • معالجة رشيقة للعلامات المشوهة في العالم الحقيقي
  • سهولة التثبيت حيث يتم تنفيذه فقط في بايثون
  • يمكن أن يكون بمثابة بديل مباشر لـ BS4 في معظم الحالات
  • عالية للتخصيص وقابلة للتوسيع

دعونا نلقي نظرة على استخدام html5lib الأساسي:

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

يمكننا أن نرى أن html5lib ينتج كائن DOM قياسيًا من المستند.

أحد الجوانب السلبية هو أن html5lib أبطأ من شيء مثل lxml. ولكنه خيار رائع عندما تحتاج إلى محلل يمكنه التعامل مع العلامات المشوهة بطريقة متوافقة مع المتصفح.

محللو HTML البديلون لـ Python

على الرغم من أن lxml وparsel وhtml5lib من بين بدائل BeautifulSoup الأكثر قدرة، إلا أن هناك بعض الخيارات الأخرى:

  • بيكويري - معالجة DOM بأسلوب jQuery.
  • جميل - OG BeautifulSoup. واجهة برمجة تطبيقات أبطأ ولكن يمكن الوصول إليها بسهولة.
  • HTMLParser - محلل HTML المدمج في بايثون.
  • htmlmin – لتصغير HTML.
  • MarkupSafe – تنفيذ محلل HTML/XML الذي يعرض العلامات ككائنات Python.

تملأ هذه المكتبات احتياجات التحليل المختلفة. يوفر PyQuery على سبيل المثال معالجة DOM بأسلوب jQuery. يظل BeautifulSoup4 شائعًا نظرًا لواجهة برمجة التطبيقات البسيطة الخاصة به.

هناك أيضًا روابط Python لموزعي HTML السريعين مثل أوز و jfast التي تستفيد من محركات التحليل الأساسية الأخرى عالية السرعة.

على الرغم من أنه ليس بديلاً مباشرًا، إلا أن HTMLParser المدمج في Python يمكن أن يعمل أيضًا لمهام التحليل الأساسية.

النقطة المهمة هي - لا تقصر نفسك على BeautifulSoup فقط. قم بتقييم احتياجاتك مقابل العديد من أدوات التحليل المتاحة.

كيف يقارن المحللون في المعايير

لتوضيح الاختلافات في الأداء، دعونا نقيس بعض العمليات الشائعة باستخدام BeautifulSoup، وlxml، وhtml5lib، وHTMLParser الخاص بـ Python.

لقد خلقت بسيطة البرنامج النصي المعياري يقوم ذلك بضرب الموزعين المختلفين في 3 مهام:

  1. تحليل صفحة HTML ويكيبيديا ~ 3 كيلو بايت
  2. العثور على كافة الروابط
  3. العثور على عناصر محددة

وهذه هي النتائج على جهاز الكمبيوتر المحمول الخاص بي:

محللتحليل الوقتالبحث عن كافة الروابطالبحث عن العنصر
com.lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
شوربة جميلة12ms18ms1ms
HTMLParser4ms32ms0.5ms

كما هو متوقع، فإن lxml سريع للغاية - أسرع بـ 10 مرات من html5lib في بعض العمليات. من المثير للدهشة أن HTMLParser يحتفظ بخاصيته في التحليل الأساسي ولكنه يبدأ في التأخر عند الاستعلام عن العناصر.

هذه المعايير في وثيقة صغيرة تبرز الاختلافات. ستزداد الفجوات اتساعًا في مستندات HTML الأكبر حجمًا حيث تتألق سرعة lxml حقًا.

أمثلة من العالم الحقيقي

دعنا الآن نستعرض بعض الأمثلة الواقعية باستخدام هذه المحللات البديلة لمهام تجريف الويب:

كشط قوائم المنتجات باستخدام lxml

سنقوم هنا باستخلاص بعض قوائم المنتجات من موقع التجارة الإلكترونية. يعمل Lxml بسرعة على استخراج أي بيانات نحتاجها:

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

باستخدام lxml، يمكننا تحليل مستندات HTML الكبيرة بسرعة واستخدام استعلامات XPath المختصرة لاستخراج أي بيانات نحتاجها.

تجريف الجداول باستخدام الباندا وhtml5lib

لنفترض أننا بحاجة إلى كشط جداول HTML في إطار بيانات الباندا. يقوم Html5lib بتوزيع الجداول بشكل موثوق:

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

يضمن التزام Html5lib بالمعايير أن يعمل تجريف الجدول بشكل متسق حتى في حالة العلامات التي بها مشكلات.

كشط النص مع بارسل

بالنسبة للصفحات ذات النصوص الثقيلة، فإن parsel يجعل عملية الاستخراج سهلة:

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

يمنحنا Parsel بساطة BeautifulSoup مع سرعة lxml!

معايير اختيار مكتبة تحليل HTML

عند تقييم جميع بدائل BeautifulSoup هذه، ما هي المعايير الأكثر أهمية لمشروعك؟

  • سرعة - إذا كان الأداء أمرًا بالغ الأهمية، فمن الصعب التغلب على lxml.

  • صحة – للحصول على تحليل موثوق للصفحات التي بها مشكلات، يتألق html5lib.

  • مجموعة الميزات - يوفر Lxml المزيد من التنقل الكامل في DOM ودعم XPath.

  • واجهة برمجة تطبيقات مألوفة - محددات CSS الخاصة بـ BeautifulSoup هي الأسهل في التعلم.

  • التعامل مع العلامات المشوهة - يتعامل Lxml وhtml5lib مع HTML الواقعي بشكل أكثر قوة.

  • المطابقة للمعايير - يتمتع Html5lib بأقصى قدر من الالتزام بسلوك متصفح HTML5.

  • سهولة الاستخدام - يقدم Parsel وPyQuery أبسط واجهات برمجة التطبيقات (APIs).

لا يوجد محلل أفضل لجميع السيناريوهات. قم بتحليل متطلباتك المحددة وحالات الاستخدام لتحديد ما هو الأمثل.

غالبًا ما يكون استخدام مجموعة من المكتبات هو الأفضل - على سبيل المثال html5lib للتحليل وlxml للاستعلام. اختبر خيارات مختلفة في نماذج الصفحات للتعرف على ما يعمل بشكل جيد وموثوق لتلبية احتياجاتك الخاصة في تجريف الويب.

الذهاب إلى محلل أقل لتجريد الويب

لقد ركزنا على مكتبات تحليل HTML هنا. ولكن تجدر الإشارة إلى أن هناك بدائل لنهج التحليل بالكامل.

من الممكن استخراج البيانات بدون محلل HTML باستخدام:

  • التعبيرات العادية - يمكن استخدام Regex لمطابقة نمط HTML الخام واستخراج البيانات. هشة ولكنها قابلة للتطبيق في بعض الأحيان في الحالات البسيطة.
  • عمليات السلاسل – استخدم أساليب سلسلة Python للعثور على سلاسل HTML وتقسيمها وتقطيعها.
  • طلبات HTTP – تقديم طلبات مباشرة إلى واجهات برمجة التطبيقات (APIs) واستخراج استجابات واجهة برمجة التطبيقات (API).
  • أتمتة المتصفح – الاستفادة من الأدوات مثل السيلينيوم لاستخراج محتوى JavaScript المعروض.
  • تحويل إلى صيغ مثل JSON/XML - كشط خلاصات البيانات المنظمة بدلاً من HTML.

يمكن أن تكون هذه الأساليب مفيدة ولكنها عادةً لا يمكن توسيع نطاقها أو العمل بشكل موثوق، خاصة بالنسبة للمواقع المعقدة. بشكل عام، يوصى بمكتبات تحليل HTML من أجل المتانة.

ولكن إذا كانت صفحاتك بسيطة للغاية أو كنت بحاجة إلى عرض JS، فقد يكون النهج الأقل محللًا كافيًا.

الوجبات السريعة الرئيسية

في حين أن Beautiful Soup يحل العديد من احتياجات تحليل HTML الشائعة، فإن البدائل مثل lxml وparsel وhtml5lib تستحق اهتمامك:

  • LXML - المعيار الذهبي للسرعة والأداء. مثالية لكشط الويب على نطاق الإنتاج.

  • جزء - واجهة برمجة تطبيقات بسيطة لسهولة التجريد. يعتمد على سرعة lxml.

  • html5lib – تحليل متوافق مع المتصفح للتأكد من الدقة والالتزام بالمعايير.

  • المعايير - Lxml أسرع بما يصل إلى 100 مرة من html5lib في بعض العمليات.

  • المعايير - السرعة مقابل سهولة القراءة مقابل الصحة. تقييم المفاضلات لحالة الاستخدام الخاصة بك.

  • لا محلل - في الحالات البسيطة، قد تعمل عمليات regex/string.

لا تقصر نفسك على BeautifulSoup فقط - يوفر نظام Python البيئي تنوعًا مذهلاً في إمكانات تحليل HTML. استفد من الأدوات المناسبة لكل وظيفة!

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *