وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقدمه ای بر کتابخانه Python lxml

0 63
زمان لازم برای مطالعه: 7 دقیقه


lxml یک کتابخانه پایتون است که امکان مدیریت آسان فایل‌های XML و HTML را فراهم می‌کند و همچنین می‌توان از آن برای خراش دادن وب استفاده کرد. تجزیه کننده های XML زیادی وجود دارد، اما برای نتایج بهتر، توسعه دهندگان گاهی اوقات ترجیح می دهند تجزیه کننده های XML و HTML خود را بنویسند. این زمانی است که کتابخانه lxml شروع به پخش می کند. مزایای کلیدی این کتابخانه این است که استفاده آسان، بسیار سریع در هنگام تجزیه اسناد بزرگ، مستندسازی بسیار خوب، و تبدیل آسان داده ها به انواع داده های پایتون و در نتیجه دستکاری فایل ها آسان تر است.

در این آموزش به سراغ پایتون می رویم lxml کتابخانه، با روش راه‌اندازی آن برای سیستم‌عامل‌های مختلف شروع می‌شود و سپس درباره مزایای آن و طیف گسترده‌ای از قابلیت‌هایی که ارائه می‌کند بحث می‌کند.

نصب و راه اندازی

راه های مختلفی برای نصب lxml وجود دارد روی سیستم شما در زیر به بررسی برخی از آنها می پردازیم.

با استفاده از Pip

پیپ یک مدیر بسته پایتون است که برای دانلود و نصب کتابخانه‌های پایتون در سیستم محلی شما به راحتی استفاده می‌شود، یعنی تمام وابستگی‌ها را برای بسته‌ای که نصب می‌کنید دانلود و نصب می‌کند.

اگر تو داری pip نصب شده است روی فقط کافیست دستور زیر را در سیستم خود اجرا کنید terminal یا خط فرمان:

$ pip install lxml

با استفاده از apt-get

اگر از MacOS یا Linux استفاده می کنید، می توانید lxml را با اجرای این دستور در خود نصب کنید terminal:

$ sudo apt-get install python-lxml

با استفاده از easy_install

احتمالاً به این قسمت نخواهید رسید، اما اگر هیچ یک از دستورات بالا به دلایلی برای شما کار نکرد، سعی کنید از آن استفاده کنید. easy_install:

$ easy_install lxml

توجه: اگر می‌خواهید هر نسخه خاصی از lxml را نصب کنید، می‌توانید به سادگی آن را هنگام اجرای دستور در خط فرمان یا terminal مثل این، lxml==3.x.y.

در حال حاضر، شما باید یک نسخه از کتابخانه lxml را نصب کرده باشید روی ماشین محلی شما حالا بیایید دستمان را کثیف کنیم و ببینیم با استفاده از این کتابخانه چه کارهای جالبی می توان انجام داد.

عملکرد

برای اینکه بتوانید از کتابخانه lxml در برنامه خود استفاده کنید، ابتدا باید این کار را انجام دهید import آی تی. با استفاده از دستور زیر می توانید این کار را انجام دهید:

from lxml import etree as et

این اراده import را etree ماژول، ماژول مورد علاقه ما، از کتابخانه lxml.

ایجاد اسناد HTML/XML

با استفاده از etree ماژول، می‌توانیم عناصر XML/HTML و عناصر فرعی آنها را ایجاد کنیم، که اگر بخواهیم یک فایل HTML یا XML را بنویسیم یا دستکاری کنیم، بسیار مفید است. بیایید سعی کنیم ساختار اصلی یک فایل HTML را با استفاده از آن ایجاد کنیم etree:

root = et.Element('html', version="5.0")



et.SubElement(root, 'head')
et.SubElement(root, 'title', bgcolor="red", fontsize='22')
et.SubElement(root, 'body', fontsize="15")

در کد بالا باید بدانید که Element تابع حداقل به یک پارامتر نیاز دارد، در حالی که SubElement عملکرد حداقل به دو مورد نیاز دارد. این به این دلیل است که Element تابع فقط به نام عنصر برای ایجاد “نیاز” دارد، در حالی که SubElement تابع به نام هر دو نیاز دارد root node و کودک node ایجاد می شود.

همچنین مهم است که بدانید هر دو این توابع فقط دارای یک کران پایین برای تعداد آرگومان هایی هستند که می توانند بپذیرند، اما کران بالایی ندارند زیرا می توانید هر تعداد که می خواهید ویژگی را با آنها مرتبط کنید. برای افزودن یک ویژگی به یک عنصر، کافی است یک پارامتر اضافی به تابع (Sub)Element اضافه کنید و ویژگی خود را به شکل زیر مشخص کنید. attributeName='attribute value'.

بیایید سعی کنیم کدی را که در بالا نوشتیم اجرا کنیم تا درک بهتری در مورد این توابع به دست آوریم:


print (et.tostring(root, pretty_print=True).decode("utf-8"))

خروجی:

<html version="5.0">
  <head/>
  <title bgcolor="red" fontsize="22"/>
  <body fontsize="15"/>
</html>

راه دیگری برای ایجاد و سازماندهی عناصر خود به صورت سلسله مراتبی وجود دارد. بیایید آن را نیز بررسی کنیم:

root = et.Element('html')
root.append(et.SubElement('head')) 
root.append(et.SubElement('body'))

بنابراین در این حالت هر زمان که یک عنصر جدید ایجاد می کنیم، آن را به سادگی به آن اضافه می کنیم root/والدین node.

تجزیه اسناد HTML/XML

تا به حال، ما فقط ایجاد عناصر جدید، تخصیص ویژگی‌ها و غیره را در نظر گرفته‌ایم. بیایید اکنون مثالی را ببینیم که در آن یک فایل HTML یا XML داریم و می‌خواهیم آن را برای استخراج اطلاعات خاص تجزیه کنیم. با فرض اینکه فایل HTML را داریم که در مثال اول ایجاد کردیم، بیایید سعی کنیم نام تگ یک عنصر خاص را بدست آوریم و سپس نام تگ همه عناصر را چاپ کنیم.

print(root.tag)

خروجی:

html 

اکنون برای تکرار از طریق تمام عناصر فرزند در root node و print برچسب های آنها:

for e in root:
    print(e.tag)

خروجی:

head
title
body

کار با ویژگی ها

حال بیایید ببینیم که چگونه صفات را به آنها مرتبط می کنیم موجود عناصر، و همچنین روش بازیابی مقدار یک ویژگی خاص برای یک عنصر معین.

با استفاده از همین root عنصر مانند قبل، کد زیر را امتحان کنید:

root.set('newAttribute', 'attributeValue') 


print(et.tostring(root, pretty_print=True).decode("utf-8"))

خروجی:

<html version="5.0" newAttribute="attributeValue">
  <head/>
  <title bgcolor="red" fontsize="22"/>
  <body fontsize="15"/>
</html>

در اینجا ما می توانیم ببینیم که newAttribute="attributeValue" در واقع به آن اضافه شده است root عنصر

اکنون سعی می کنیم مقادیر ویژگی هایی را که در کد بالا تنظیم کرده ایم، بدست آوریم. در اینجا ما با استفاده از نمایه سازی آرایه به عنصر فرزند دسترسی پیدا می کنیم روی را root عنصر، و سپس استفاده کنید get() روش بازیابی ویژگی:

print(root.get('newAttribute'))
print(root(1).get('alpha')) 
print(root(1).get('bgcolor'))

خروجی:

attributeValue
None
red

بازیابی متن از عناصر

اکنون که عملکردهای اساسی را دیدیم etree ماژول، بیایید سعی کنیم کارهای جالب تری را با فایل های HTML و XML خود انجام دهیم. تقریباً همیشه، این فایل ها دارای مقداری متن در بین برچسب ها هستند. بنابراین، بیایید ببینیم چگونه می توانیم متن را به عناصر خود اضافه کنیم:


root = et.Element('html', version="5.0")
et.SubElement(root, 'head')
et.SubElement(root, 'title', bgcolor="red", fontsize="22")
et.SubElement(root, 'body', fontsize="15")


root.text = "This is an HTML file"
root(0).text = "This is the head of that file"
root(1).text = "This is the title of that file"
root(2).text = "This is the body of that file and would contain paragraphs etc"

print(et.tostring(root, pretty_print=True).decode("utf-8"))

خروجی:

<html version="5.0">This is an HTML file<head>This is the head of that file</head><title bgcolor="red" fontsize="22">This is the title of that file</title><body fontsize="15">This is the body of that file and would contain paragraphs etc</body></html>

بررسی کنید که آیا یک عنصر دارای فرزند است یا خیر

در مرحله بعد، دو چیز بسیار مهم وجود دارد که باید بتوانیم آنها را بررسی کنیم، زیرا در بسیاری از برنامه های خراش دادن وب برای رسیدگی به استثناء مورد نیاز است. اولین چیزی که می‌خواهیم بررسی کنیم این است که آیا یک عنصر دارای فرزند است یا نه، و دوم اینکه آیا a node هست یک Element.

بیایید این کار را برای گره هایی که در بالا ایجاد کردیم انجام دهیم:

if len(root) > 0:
    print("True")
else:
    print("False")

کد فوق “True” را از آنجایی که root node گره های فرزند دارد. با این حال، اگر ما همان مورد را بررسی کنیم rootگره های فرزند، مانند کد زیر، خروجی “False” خواهد بود.

for i in range(len(root)):
    if (len(root(i)) > 0):
        print("True")
    else:
        print("False")

خروجی:

False
False
False

حالا بیایید همین کار را انجام دهیم تا ببینیم آیا هر یک از گره ها an هستند یا خیر Element یا نه:

for i in range(len(root)):
    print(et.iselement(root(i)))

خروجی:

True
True
True

را iselement روش برای تعیین اینکه آیا شما معتبر هستید مفید است Element شی، و بنابراین اگر می توانید با استفاده از روش هایی که در اینجا نشان داده ایم به پیمایش آن ادامه دهید.

بررسی کنید که آیا یک عنصر والد دارد یا خیر

همین الان، ما نشان دادیم که چگونه باید برویم پایین سلسله مراتب، یعنی چگونه بررسی کنیم که آیا یک عنصر دارای فرزند است یا نه، و اکنون در این بخش سعی می کنیم بالا سلسله مراتب، یعنی چگونه می توان والدین یک کودک را بررسی کرد و به دست آورد node.

print(root.getparent())
print(root(0).getparent())
print(root(1).getparent())

خط اول نباید چیزی را برگرداند (معروف به None) به عنوان root node خودش هیچ پدر و مادری ندارد دو مورد دیگر هر دو باید به آن اشاره کنند root عنصر یعنی تگ HTML. بیایید خروجی را بررسی کنیم تا ببینیم آیا همان چیزی است که ما انتظار داریم:

خروجی:

None
<Element html at 0x1103c9688>
<Element html at 0x1103c9688>

بازیابی خواهر و برادر عنصر

در این بخش روش تراورس را یاد خواهیم گرفت به پهلو در سلسله مراتب، که خواهر و برادر یک عنصر را در درخت بازیابی می کند.

پیمایش درخت از پهلو کاملاً شبیه پیمایش عمودی آن است. برای دومی از آن استفاده کردیم getparent و طول عنصر، برای اولی، استفاده خواهیم کرد getnext و getprevious کارکرد. بیایید آنها را امتحان کنیم روی گره هایی که قبلا ایجاد کردیم تا ببینیم چگونه کار می کنند:


print(root(1).getnext()) 
print(root(1).getprevious()) 

خروجی:

<Element body at 0x10b5a75c8>
<Element head at 0x10b5a76c8>

در اینجا می توانید آن را ببینید root(1).getnext() تگ “body” را از آنجایی که عنصر بعدی بود، بازیابی کرد و root(1).getprevious() تگ “head” را بازیابی کرد.

به طور مشابه، اگر ما از آن استفاده کرده بودیم getprevious تابع روی root، برمی گشت Noneو اگر از آن استفاده کرده بودیم getnext تابع روی root(2)، آن را نیز بازگشت None.

تجزیه XML از یک رشته

در حال حرکت روی، اگر یک فایل XML یا HTML داریم و می‌خواهیم رشته خام را برای بدست آوردن یا دستکاری اطلاعات مورد نیاز تجزیه کنیم، می‌توانیم با دنبال کردن مثال زیر این کار را انجام دهیم:

root = et.XML('<html version="5.0">This is an HTML file<head>This is the head of that file</head><title bgcolor="red" fontsize="22">This is the title of that file</title><body fontsize="15">This is the body of that file and would contain paragraphs etc</body></html>')
root(1).text = "The title text has changed!"
print(et.tostring(root, xml_declaration=True).decode('utf-8'))

خروجی:

<?xml version='1.0' encoding='ASCII'?>
<html version="5.0">This is an HTML file<head>This is the head of that file</head><title bgcolor="red" fontsize="22">The title text has changed!</title><body fontsize="15">This is the body of that file and would contain paragraphs etc</body></html>

همانطور که می بینید، ما با موفقیت برخی از متن ها را در سند HTML تغییر دادیم. اعلان doctype XML نیز به دلیل xml_declaration پارامتری که به آن ارسال کردیم tostring تابع.

جستجو برای عناصر

آخرین چیزی که می خواهیم در مورد آن بحث کنیم، هنگام تجزیه فایل های XML و HTML بسیار مفید است. ما راه هایی را بررسی خواهیم کرد که از طریق آنها بتوانیم ببینیم آیا یک Element نوع خاصی از بچه ها را دارد و اگر انجام می دهد شامل چه مواردی می شود.

این موارد کاربرد عملی زیادی دارد، مانند یافتن همه عناصر پیوند روی یک وب خاص page.

print(root.find('a')) 
print(root.find('head').tag)
print(root.findtext('title')) 

خروجی:

None
head
This is the title of that file

نتیجه

در آموزش فوق با مقدمه ای مقدماتی در مورد اینکه کتابخانه lxml چیست و چه کاربردی دارد شروع کردیم. پس از آن، روش نصب آن را یاد گرفتیم روی محیط های مختلف مانند ویندوز، لینوکس و غیره متحرک روی، ما عملکردهای مختلفی را بررسی کردیم که می تواند به ما در عبور از درخت HTML/XML به صورت عمودی و همچنین جانبی کمک کند. در پایان همچنین راه های یافتن عناصر در درخت و همچنین به دست آوردن اطلاعات از آنها را مورد بحث قرار دادیم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-23 16:59:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید