शेल में सौ HTML स्रोत कोड फ़ाइलों को पार्स कैसे करें?


23

मैं एक सौ html स्रोत कोड फ़ाइलों की एक जोड़ी है। मुझे <div>इनमें से प्रत्येक फ़ाइल से एक विशेष तत्व की सामग्री को निकालने की आवश्यकता है इसलिए मैं प्रत्येक फ़ाइल के माध्यम से लूप में एक स्क्रिप्ट लिखने जा रहा हूं। तत्व संरचना इस प्रकार है:

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

क्या कोई ऐसा तरीका सुझा सकता है जिसके द्वारा मैं the_div_idlinux कमांड लाइन का उपयोग करके div और सभी चाइल्ड एलिमेंट्स और कंटेंट को एक फाइल से निकाल सकूँ ?

जवाबों:


27

एचटीएमएल-एक्सएमएल-utils संकुल, सबसे प्रमुख लिनक्स वितरण में उपलब्ध है, उपकरण है कि उपयोगी होते हैं जब HTML और XML दस्तावेजों के साथ काम की एक संख्या है। आपके मामले के लिए विशेष रूप से उपयोगी है hxselectजो सीएसएस चयनकर्ताओं के आधार पर मानक इनपुट और अर्क तत्वों से पढ़ता है। आपका उपयोग मामला जैसा दिखेगा:

hxselect '#the_div_id' <file

आपको इनपुट के बारे में शिकायत मिल सकती है कि आप इसे क्या खिला रहे हैं, इस पर निर्भर करता है। यह शिकायत मानक त्रुटि पर दी गई है और इस प्रकार यदि आवश्यक हो तो आसानी से दबाया जा सकता है। इसका एक विकल्प पर्ल के HTML :: PARSER पैकेज का उपयोग करना होगा; हालाँकि, मैं छोड़ दूँगा कि पर्ल कौशल वाले किसी व्यक्ति के पास मेरी तुलना में कम जंग हो।


1
hxselectकी तुलना में इनपुट प्रारूप के बारे में अधिक picky है pup। उदाहरण के लिए, मैं हो रही है Input is not well-formed. (Maybe try normalize?)साथ hxselect जहां pupबस इसे पार्स करने।
AB


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 ;)
AB

1

यहाँ प्रत्येक फ़ाइल से उस हिस्से को निकालने के लिए पूर्व वन-लाइनर है:

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

इन-प्लेस को बचाने / बदलने के लिए, सेक्शन -cqa!में बदलाव करें -cxaऔर निकालें %p। पुनरावृत्ति के लिए, ग्लोबिंग ( **/*.html) का उपयोग करने पर विचार करें ।

यह मूल रूप से प्रत्येक बफर / फ़ाइल ( bufdo) के लिए है, यह निम्नलिखित क्रियाएं कर रहा है:

  • /pattern - पैटर्न खोजें
  • norm - सामान्य वी कीस्ट्रोक्स का अनुकरण करना शुरू करें
    • n - अगले पैटर्न में कूदें (पूर्व मोड में आवश्यक)
    • vatd- चयनित बाहरी टैग अनुभाग निकालें (देखें: html टैग के बीच कूद )
    • ggdG- पूरे बफ़र को निकालें (समतुल्य :%d)
    • "2p - पहले से हटाए गए पाठ को फिर से पेस्ट करें

शायद बहुत कुशल और POSIX नहीं ( :bufdo), लेकिन यह काम करना चाहिए।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.