শেলের মধ্যে শত শত এইচটিএমএল উত্স কোড ফাইলগুলি কীভাবে পার্স করবেন?


23

আমার কাছে কয়েকশত এইচটিএমএল সোর্স কোড ফাইল রয়েছে। <div>এই ফাইলগুলির প্রত্যেকটি থেকে আমার একটি নির্দিষ্ট উপাদানের সামগ্রী বের করতে হবে যাতে আমি প্রতিটি ফাইলের মধ্য দিয়ে লুপ করতে একটি স্ক্রিপ্ট লিখতে যাচ্ছি। উপাদান কাঠামোটি এরকম:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

কেউ কি এমন কোনও পদ্ধতির পরামর্শ দিতে পারবেন যার মাধ্যমে আমি the_div_idলিনাক্স কমান্ড লাইনটি ব্যবহার করে কোনও ফাইল থেকে ডিভ এবং সমস্ত শিশু উপাদান এবং সামগ্রীগুলি বের করতে পারি ?

উত্তর:


27

এইচটিএমএল-XML-utils প্যাকেজ, সবচেয়ে প্রধান লিনাক্স ডিস্ট্রিবিউশন পাওয়া যায়, সরঞ্জাম উপযোগী যখন HTML এবং XML দস্তাবেজগুলিতে সাথে ডিল করার একটি নম্বর আছে। আপনার ক্ষেত্রে বিশেষত কার্যকর এটি hxselectযা স্ট্যান্ডার্ড ইনপুট থেকে পড়ে এবং সিএসএস নির্বাচকদের উপর ভিত্তি করে উপাদানগুলি বের করে। আপনার ব্যবহারের কেসটি দেখতে এমন হবে:

hxselect '#the_div_id' <file

আপনি কী খাওয়ান তার উপর নির্ভর করে ইনপুটটি ভালভাবে তৈরি না হওয়ার বিষয়ে আপনি অভিযোগ পেতে পারেন। এই অভিযোগটি স্ট্যান্ডার্ড ত্রুটির উপরে দেওয়া হয়েছে এবং প্রয়োজনে সহজেই দমন করা যায়। এর বিকল্প হ'ল পার্লের এইচটিএমএল :: পার্সার প্যাকেজটি ব্যবহার করা; তবে আমি পার্ল দক্ষতা সম্পন্ন কারও কাছে নিজের থেকে কম মরিচা ফেলে দেব।


1
hxselectতুলনায় ইনপুট ফর্ম্যাট সম্পর্কে আরও পিক pup। উদাহরণস্বরূপ, আমি পেয়ে করছি Input is not well-formed. (Maybe try normalize?)সঙ্গে hxselect যেখানে pupশুধু এটা পার্স।
এবি

12

চেষ্টা করুন pup, এইচটিএমএল প্রক্রিয়াকরণের জন্য একটি কমান্ড লাইন সরঞ্জাম। উদাহরণ স্বরূপ:

pup '#the_div_id' < file.html

টেরররিফ্রিফ!
সিসি

4

এখানে একটি অনির্ধারিত পার্ল স্ক্রিপ্ট যা <div id="the_div_id">উপাদানগুলি ব্যবহার করে এবং তাদের সামগ্রীগুলি বের করে HTML::TreeBuilder

#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

আপনি যদি পার্লকে অ্যালার্জি করে থাকেন তবে পাইথন রয়েছে HTMLParser

পিএস নিয়মিত এক্সপ্রেশন ব্যবহার করার চেষ্টা করবেন না।


1
পাইথন পুরো হয়েছে doc.scrapy.org/en/latest/intro/overview.html );
এবি

1

প্রতিটি ফাইল থেকে সেই অংশটি বের করতে এখানে এক্স ওলাইনার রয়েছে:

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

সংরক্ষণ করতে / ইন-জায়গা, পরিবর্তন প্রতিস্থাপন -cqa!মধ্যে -cxaএবং অপসারণ %pঅধ্যায়। পুনরাবৃত্তির জন্য, গ্লোববিং ( **/*.html) ব্যবহার করে বিবেচনা করুন ।

এটি মূলত প্রতিটি বাফার / ফাইল ( bufdo) এর জন্য এটি নিম্নলিখিত ক্রিয়া করে:

  • /pattern - প্যাটার্নটি সন্ধান করুন
  • norm - সাধারণ vi কীস্ট্রোক অনুকরণ শুরু করুন
    • n - পরবর্তী প্যাটার্নে ঝাঁপ দাও (প্রাক্তন মোডে প্রয়োজনীয়)
    • vatd- নির্বাচিত বাইরের ট্যাগ বিভাগটি সরান (দেখুন: এইচটিএমএল ট্যাগের মধ্যে জাম্পিং )
    • ggdG- পুরো বাফার সরান (সমতুল্য :%d)
    • "2p - পূর্ববর্তীভাবে মোছা পাঠ্য পুনরায় পেস্ট করুন

হতে পারে খুব দক্ষ না এবং পসিএক্স ( :bufdo) নয়, তবে এটি কাজ করা উচিত।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.