من فرایندی دارم که باید همه تصاویر را از یک صفحه وب کپی کنم. من از این فرایند با استفاده کردم xmllint
، که یک فایل XML یا HTML را پردازش می کند و سوابق ذخیره شده شما را چاپ می کند. اما وقتی ارائه دهنده سرور میزبان سیستم های خود را به روز کرد ، آنها آن را روشن نکردند xmllint
. بنابراین من مجبور شدم راهی دیگر برای استخراج لیستی از تصاویر از یک صفحه HTML پیدا کنم. به نظر می رسد که شما می توانید این کار را در Bash انجام دهید.
ممکن است فکر نکنید که Bash می تواند پرونده های داده را تجزیه و تحلیل کند ، اما با کمی فکر هوشمندانه می تواند. Bash ، مانند سایر پوسته های UNIX قبل از آن ، می تواند ردیف ها را یک به یک از پرونده با استفاده از داخلی تجزیه و تحلیل کند read
بیانیه.
پیش فرض read
عبارت یک ردیف از داده ها را اسکن کرده و به قسمت ها تقسیم می کند. معمولا read
با استفاده از فاصله ها و برگه ها ، زمینه ها را از هم جدا می کند ، خطوط جدیدی که در هر خط به پایان می رسند ، اما شما می توانید با تنظیم یک Separator Field (داخلی) این رفتار را تغییر دهید (IFS
) مقدار و جدا کننده در انتهای خط (-d
)
برای تجزیه یک فایل HTML با استفاده از read
، نگرش های IFS
به شخصیتی بزرگتر از (>
) و جداکننده به نویسه کوچکتر از (<
) هر بار که Bash خطی را اسکن می کند ، به خط بعدی تجزیه و تحلیل می شود <
(ابتدا برچسب HTML) سپس این داده ها را برای همه تقسیم می کند >
(انتهای برچسب HTML). این کد نمونه یک سفارش ورودی می گیرد و داده ها را به دو بخش تقسیم می کند TAG
و VALUE
متغیرها:
local IFS='>' read -d '<' TAG VALUE
بیایید نحوه کار این را بررسی کنیم. این فایل HTML ساده را در نظر بگیرید:
<img src="https://www.cloudsavvyit.com/8315/parsing-html-in-bash/logo.png" alt="My logo" /> <p>some text</p>
اولین بار read
این پرونده را تجزیه و تحلیل می کند ، در ابتدا متوقف می شود <
نماد. از جانب <
اولین کاراکتر این ورودی نمونه است ، به این معنی که Bash یک رشته خالی پیدا می کند. نتیجه TAG
و VALUE
رشته ها نیز خالی است. اما این برای مورد استفاده من خوب است.
دفعه بعدی که باش ورودی را می خواند ، آن را می گیرد img src="https://www.cloudsavvyit.com/8315/parsing-html-in-bash/logo.png"↲alt="My logo" />↲
با یک ردیف جدید درست قبل از ارتفاع و قبل از آن متوقف می شود <
در خط بعدی سپس read
خط را در تقسیم می کند >
نمادی که برگ می زند TAG
s img src="https://www.cloudsavvyit.com/8315/parsing-html-in-bash/logo.png"↲alt="My logo" /
و VALUE
با یک خط جدید خالی
بار سوم read
فایل HTML دریافت شده را تجزیه و تحلیل می کند p>some text
. باش رشته را به داخل تقسیم می کند >
منجر به TAG
حاوی p
و VALUE
s some text
.
اکنون که نحوه استفاده را فهمیدید read
، تجزیه یک فایل HTML طولانی تر با Bash آسان است. با یک ویژگی Bash به نام شروع کنید xmlgetnext
برای تجزیه و تحلیل داده ها با استفاده از read
همانطور که این کار را بارها و بارها در متن انجام می دهید. من عملکرد خود را نامگذاری کردم xmlgetnext
برای یادآوری من ، این جایگزین لینوکس است xmllint
برنامه ، اما من به همین راحتی می توانم آن را نامگذاری کنم htmlgetnext
.
xmlgetnext () { local IFS='>' read -d '<' TAG VALUE }
حالا به این زنگ بزن xmlgetnext
تابع برای تجزیه فایل HTML. این کامل من است htmltags
متن:
#!/bin/sh # print a list of all html tags xmlgetnext () { local IFS='>' read -d '<' TAG VALUE } cat $1 | while xmlgetnext ; do echo $TAG ; done
آخرین خط کلید است. با استفاده از آن پرونده را دور می زند xmlgetnext
برای تجزیه و تحلیل HTML و فقط چاپ TAG
سوابق. و به همین دلیل echo
با تقسیم کننده های میدان استاندارد کار می کند ، هر خطی مانند img src="https://www.cloudsavvyit.com/8315/parsing-html-in-bash/logo.png"↲alt="My logo" /
که حاوی یک خط جدید هستند در یک خط چاپ می شوند ، مانند img src="https://www.cloudsavvyit.com/8315/parsing-html-in-bash/logo.png" alt="My logo" /
.

برای بازیابی فقط لیست تصاویر ، خروجی این اسکریپت را اجرا می کنم grep
فقط ردیف هایی را که دارند چاپ کنید img
در ابتدای خط برچسب بزنید.
منبع: khabar-mehman.ir