Parse xml rss feeds python cover

توجد البيانات بتنسيقات مختلفة، من جداول CSV البسيطة وكائنات JSON إلى مستندات XML الأكثر وصفاً وتسلسلاً هرمياً. قد يبدو XML قديماً بعض الشيء، لكنه لا يزال موجوداً في كل مكان: في موجزات RSS وواجهات API وإعدادات البرامج.

قبل أن تتمكن من استخدام بيانات XML، عليك تحليلها. بعبارة أخرى، أنت تعلّم برنامجك قراءة ما بداخلها. وباستخدام مكتبات Python مثل ElementTree وminidom وlxml، تصبح عملية تحليل XML واضحة وبديهية.

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

أساسيات XML

يرمز XML إلى لغة الترميز القابلة للتوسعة، وهو تنسيق عالمي لتخزين البيانات ونقلها. تتيح بنيته للبشر قراءته بسهولة مع بقائه متوافقاً مع الآلات. صُممت هذه اللغة مع التركيز على البساطة وقابلية التكيف وسهولة الاستخدام الواسع على الإنترنت.

يمكن وصف XML على أفضل نحو بأنه شجرة. فكما للشجرة الحقيقية أغصان وأوراق، له عنصر جذر وعناصر فرعية متداخلة. يوضح هذا الإطار كيفية ترتيب XML للبيانات في تنسيق هرمي. توفر Python أساليب متعددة للتعامل مع بيانات XML، وتعد وحدة ElementTree من أكثر الخيارات شيوعاً. تتضمن وحدة ElementTree فئتين أساسيتين: ElementTree الذي يمثل المستند كاملاً، وElement الذي يمثل عقدة منفردة. 

كيف يحلل المطورون XML: الأساليب الرئيسية

في Python، تكون دالة parse() هي الخطوة الأولى عادةً للتعامل مع ملفات XML. فهي تعالج مستند XML وتحوله إلى بنية شجرية يستطيع برنامجك التنقل فيها. وتشكل هذه الدالة أساس أساليب التحليل المختلفة، سواء كنت تستخدم ElementTree أو lxml أو مكتبات أخرى.

لفهم أساليب التحليل، عليك أولاً معرفة عناصر ملف XML:

  • مساحة الاسم – تساعد على تجنب تعارضات التسمية عبر تحديد أسماء العناصر والسمات.
  • العنصر الجذر – الحاوية الرئيسية التي تضم جميع العناصر الأخرى.
  • السمات – أزواج من المفاتيح والقيم تقدم معلومات إضافية عن العناصر.
  • العناصر الفرعية – عناصر متداخلة تنظم البيانات هرمياً.
  • المحتوى النصي – المعلومات الفعلية الموجودة داخل العناصر.

تنشئ هذه العناصر تنسيقاً منظماً يتيح للبرامج تخزين البيانات المعقدة ومشاركتها. وبعد فهم البنية، يمكننا استعراض أساليب تحليل XML الرئيسية في Python: 

1. وحدة ElementTree  

مكتبة مدمجة في Python توفر API سهلة الاستخدام لاستكشاف أشجار XML. وهي مناسبة لمعظم المهام لأنها توازن بين سهولة الاستخدام والأداء.  

2. lxml  

مكتبة خارجية تدعم XPath وXSLT والتحقق من الصحة. وهي أسرع وتضم ميزات أكثر من ElementTree، ومثالية لمعالجة XML المعقدة.  

3. DOM (نموذج كائن المستند)  

يحمّل هذا المستند الكامل من XML إلى الذاكرة كبنية شجرية. وعلى الرغم من أنه سهل التنقل والتعديل، فقد يستهلك كثيراً من الذاكرة مع الملفات الأكبر. 

4. SAX (API البسيطة لـ XML)  

محلل يعتمد على الأحداث ويعالج XML بالتسلسل. إنه فعّال من حيث استخدام الذاكرة وسريع في التعامل مع الملفات الكبيرة، لكنه قد يكون أقل سهولة لإدارة العمليات المعقدة.  

5. Untangle  

يحوّل بيانات XML إلى كائنات Python لسهولة الوصول إليها. وهو مثالي للتحليل السريع بأقل قدر من الشيفرة، لكنه أقل قابلية للتكيف مع هياكل XML المعقدة.  

ستحتاج لهذا الدليل إلى…

  • Python ومكتبة requests في Python 

إذا لم تكن Python 3.x مثبتة على جهازك، فيمكنك تنزيلها من https://www.python.org/. افتح الطرفية وثبّت Requests باستخدام pip:

pip install requests or  pip3 install requests

  • Visual Studio Code (VS Code)

لتشغيل جميع الأوامر اللازمة، يمكنك استخدام الطرفية في Visual Studio Code (VS Code). ما عليك سوى تنزيله من الموقع الرسمي واتّباع تعليمات التثبيت الخاصة بنظام التشغيل لديك.

  • موجز RSS

موجز RSS هو تنسيق خاص لملفات XML يُستخدم لتقديم الأخبار أو التحديثات تلقائياً من موقع ويب. وببساطة، هو نوع من “قائمة بأحدث المنشورات” منظّم بطريقة تستطيع البرامج قراءتها.

على سبيل المثال، يوجد في موقعنا قسم للدروس. وبدلاً من تفقد الموقع يومياً لمعرفة ما إذا نُشر درس جديد، يوفر الموقع موجز RSS، وهو ملف XML يحتوي على معلومات عن جميع المنشورات الحديثة. سنستخدم موجز RSS من DataImpulse في هذا الدليل. والآن، لنلقِ نظرة على المكتبات التي نحتاج إليها والشيفرة التالية.

ElementTree

لنرَ كيفية استخدام وحدة ElementTree المدمجة في Python لتحليل بيانات XML من موجز RSS. 

الخطوة الأولى هي استيراد xml.etree.ElementTree. العملية بسيطة: نرسل طلب GET إلى URL موجز RSS، ويستجيب الخادم ببيانات XML. وتعطينا السمة .content من الاستجابة بيانات البايت الخام التي يستطيع ElementTree تحليلها. وباستخدام ET.fromstring()، نحوّل نص XML هذا إلى بنية شجرية ونحصل على العنصر الجذر. وفي داخله، يُنظم معظم المحتوى ضمن عناصر <channel><item> العناصر.

تعيد دالة find() تعيد الدالة العنصر المطابق الأول، بينما findall() تعيد جميع العناصر الفرعية ذات الوسم المحدد. وهنا، items قائمة بكل العناصر، يمثل كل منها درساً أو مقالاً.

مثال على الشيفرة: 


import xml.etree.ElementTree as ET
import requests

# URL of the RSS feed (from DataImpulse site)
FEED_URL = "https://dataimpulse.com/tutorials-category/web-scraping-seo/feed/"

# Download the XML data
response = requests.get(FEED_URL)
xml_data = response.content

# Parse the XML
root = ET.fromstring(xml_data)

# In RSS feeds, items are inside 
channel = root.find("channel")
items = channel.findall("item")

# Print titles and links of the items
for item in items:
   title = item.findtext("title")
   link = item.findtext("link")
   print(f"Title: {title}")
   print(f"Link: {link}\n")
      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

وأخيراً، نستخرج العنوان والرابط لكل عنصر ونطبعهما باستخدام findtext()، التي تجلب المحتوى النصي مباشرةً. عند تشغيل السكربت، ستحصل على قائمة مطبوعة بشكل منظم بكل عناوين الدروس وروابط URL الخاصة بها. 

lxml 

Lxml مكتبة خارجية توسّع وظائف ElementTree وتضيف دعماً لـ XPath، وهي لغة استعلامات للتنقل في مستندات XML. في هذا المثال، سنستخدم lxml.etree لتحليل موجز RSS واستخراج عناوين المنشورات.

نبدأ بجلب موجز RSS باستخدام requests.get()، تماماً كما سبق. ثم يُمرر محتوى الاستجابة إلى etree.fromstring()، التي تحلل XML وتعيد العنصر الجذر. ومع lxml، يمكننا استخدام تعبيرات XPath للعثور على العناصر، لأنها تجعل التنقل أسرع وأكثر مرونة من أساليب ElementTree القياسية.


import requests
from lxml import etree

# URL of the RSS feed
FEED_URL = "https://dataimpulse.com/tutorials-category/web-scraping-seo/feed/"

# Download the XML data
response = requests.get(FEED_URL)
xml_data = response.content

# Parse XML
root = etree.fromstring(xml_data)
items = root.xpath("//channel/item")

# Show list of titles with numbers
print("Available blog posts:\n")
for item in items:
   title = item.findtext("title")
   print(title)
      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

وأخيراً، نمر عبر عناصر <item> ونستخرج عنوان كل منشور باستخدام findtext(“title”)، ثم نطبعها.

Minidom 

في هذا المثال، نستخدم Minidom، وهو اختصار لـ التنفيذ الأدنى لـ DOM. وهو جزء من مكتبة Python القياسية ويعمل بتحميل مستند XML كاملاً إلى الذاكرة كنموذج كائن المستند DOM. 

نستدعي minidom.parseString() لتحليل XML وبناء كائن DOM (doc). ومن أساليب DOM المعروفة، سنستخدم اثنين. الأول هو getElementsByTagName(“tag”,) الذي يعثر على كل العناصر ذات اسم الوسم المحدد. أما الثاني فهو .firstChild.nodeValue الذي يسترجع المحتوى النصي لعقدة.

وأخيراً، نستخدم toprettyxml(). وتُستخدم لطباعة عنصر item الأول بتنسيق XML منظم.  

إليك كيفية تحليل البيانات من موجز RSS باستخدام Minidom:


import requests
from xml.dom import minidom

# URL of the RSS feed
FEED_URL = "https://dataimpulse.com/tutorials-category/web-scraping-seo/feed/"

# Download XML data
response = requests.get(FEED_URL)
xml_data = response.content

# Parse XML with minidom
doc = minidom.parseString(xml_data)

# Get all  elements
items = doc.getElementsByTagName("item")

print(f"Total articles found in feed: {len(items)}\n")

# Show titles with links
for i, item in enumerate(items, start=1):
   title = item.getElementsByTagName("title")[0].firstChild.nodeValue
   link = item.getElementsByTagName("link")[0].firstChild.nodeValue
   print(f"{i}. {title}")
   print(f"   Link: {link}\n")

# Show raw XML of the first  (just for demo)
print("First  as raw XML:\n")
print(items[0].toprettyxml())
      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

SAX 

يقرأ SAX ملف XML بالتسلسل، عنصراً بعد عنصر. وهو يطلق أحداثاً محددة لكل جزء من XML:

  • startElement(name, attrs) ← عند بدء وسم
  • characters(content) ← عند قراءة نص بين الوسوم
  • endElement(name) ← عند انتهاء وسم

احفظ الشيفرة في الملف وشغّلها: 


import requests
import xml.sax

# Custom handler for SAX parsing
class RSSHandler(xml.sax.ContentHandler):
   def __init__(self):
       super().__init__()
       self.current_tag = ""
       self.in_item = False
       self.title = ""
       self.link = ""
       self.counter = 0

   def startElement(self, name, attrs):
       if name == "item":
           self.in_item = True
           self.title = ""
           self.link = ""
       self.current_tag = name

   def characters(self, content):
       if self.in_item:
           if self.current_tag == "title":
               self.title += content
           elif self.current_tag == "link":
               self.link += content

   def endElement(self, name):
       if name == "item":
           self.counter += 1
           print(f"{self.counter}. {self.title.strip()}")
           print(f"   Link: {self.link.strip()}\n")
           self.in_item = False
       self.current_tag = ""

# Download the XML feed
FEED_URL = "https://dataimpulse.com/tutorials-category/web-scraping-seo/feed/"
response = requests.get(FEED_URL)
xml_data = response.content

# Parse XML with SAX
print("Parsing RSS feed with SAX...\n")
handler = RSSHandler()
xml.sax.parseString(xml_data, handler)

print(f"Total items parsed: {handler.counter}")
      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

ميزة هذا الأسلوب هي الكفاءة في استخدام الذاكرة، لأنه لا يخزن المستند كاملاً. 

Untangle

يُعد هذا الأسلوب طريقة أبسط للتعامل مع XML. تحوّل مكتبة Untangle مستندات XML إلى كائنات Python، ما يعني عدم الحاجة إلى اجتياز العناصر يدوياً أو معالجة الأحداث. 

عند تحليل XML باستخدام untangle.parse(), فإنه يقرأ ملف XML تلقائياً، فإنه يقرأ ملف XML تلقائياً، ويحوّل كل وسم XML إلى كائن Python، ويخزن بيانات الوسم في سمات .cdata (إذا كانت محتوى نصياً). وبدلاً من العمل مع العقد أو الأحداث، يمكنك ببساطة التنقل في بنية XML كما لو كانت كائن Python عادياً. 

إليك الشيفرة:


import requests
import untangle
from io import BytesIO

# RSS feed from DataImpulse
FEED_URL = "https://dataimpulse.com/tutorials-category/web-scraping-seo/feed/"

# Download XML
resp = requests.get(FEED_URL)
resp.raise_for_status()
xml_bytes = resp.content

# Parse XML with untangle (use BytesIO for bytes input)
doc = untangle.parse(BytesIO(xml_bytes))

# Get all  elements
items = doc.rss.channel.item

print("Articles from DataImpulse RSS:\n")

# Print articles
for i, it in enumerate(items, start=1):
   title = it.title.cdata if hasattr(it, "title") else ""
   link = it.link.cdata if hasattr(it, "link") else ""
   desc = it.description.cdata if hasattr(it, "description") else ""
  
   print(f"{i}. {title}")
   print(f"   Link: {link}")
   if desc:
       print(f"   Description: {desc}")
   print()

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

بعض التوصيات الإضافية

  • تحقق من الأخطاء أثناء التحليل

قد تكون الموجزات غير متاحة أحياناً أو تحتوي على وسوم غير متوقعة. في هذه الحالات، استخدم try/except عند تنزيل XML أو تحليله.

  • اختر .content لتنزيلات XML

تعيد دالة .content تعيد السمة بيانات البايت الخام، مما يمنع مشكلات الترميز التي قد تسببها سمة .text السمة قد تسببها.

  • تحقق من وجود العناصر 

ليست كل ملفات XML ذات البنية نفسها. استخدم شروطاً مثل if item.find(‘title’) is not None قبل الوصول إلى الوسوم.

  • انتبه إلى استخدام الموارد مع الملفات الكبيرة

بالنسبة إلى مستندات XML الضخمة، استخدم SAX الذي يقرأ البيانات بالتتابع من دون تحميل كل شيء في الذاكرة.

قد يكون جلب XML من المواقع الخارجية صعباً. تساعد البروكسيات على ضمان وصول سلس عبر المواقع الجغرافية والحفاظ على الخصوصية.

أهم النقاط

  • تحليل XML هو عملية قراءة ملفات XML واستخراج البيانات منها بطريقة منظمة وقابلة للاستخدام.
  • يوفر ElementTree نهجاً قائماً على الشجرة للتنقل بين عناصر XML واستخراجها.
  • lxml مكتبة تدعم استعلامات XPath لتحليل XML بصورة أسرع.
  • يحمّل Minidom ملف XML كاملاً كشجرة DOM، مما يتيح لك الوصول إلى العقد والنص كما لو كان كائناً منظماً.
  • يعد SAX مثالياً لملفات XML الكبيرة لأنه يعالج XML خطوة بخطوة من دون الاحتفاظ بكل شيء في الذاكرة.
  • يحوّل Untangle XML إلى كائنات Python للوصول بسهولة إلى الوسوم ومحتواها.

مقالات ذات صلة 

دمج البروكسيات مع requests في Python

كيفية تجريف eBay باستخدام Python والبروكسيات

كيفية إعداد بروكسيات DataImpulse في Java

تجريف بيانات منتجات Amazon باستخدام Python

إنشاء مدوّر بروكسيات مخصص باستخدام Python

التعامل مع فحوصات الأمان باستخدام Python وSelenium

Share article: