از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقدمه ای بر کتابخانه Python lxml
سرفصلهای مطلب
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