تجزیه و تحلیل HTML در Bash – CloudSavvy IT


من فرایندی دارم که باید همه تصاویر را از یک صفحه وب کپی کنم. من از این فرایند با استفاده کردم 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" /.

عکس صفحه نمایش تجزیه HTML در Bash
تجزیه HTML در Bash

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


منبع: khabar-mehman.ir

دیدگاهتان را بنویسید

Comment
Name*
Mail*
Website*