दो टैग के बीच का पाठ


23

मैं <tr> </tr>एक html डॉक्टर से इन दो टैग के बीच जो कुछ भी है उसे पुनः प्राप्त करना चाहता हूं । अब मेरे पास कोई विशिष्ट HTML आवश्यकताएं नहीं हैं जो एक html पार्सर के लिए वारंट करेगी। मैं सिर्फ सादा जरूरत कुछ मैचों <tr>और </tr>और बीच में सब कुछ हो जाता है और कई हो सकता trहै। मैंने जागने की कोशिश की, जो काम करता है, लेकिन किसी कारण से यह मुझे प्रत्येक पंक्ति के डुप्लिकेट को निकालने के लिए समाप्त होता है।

awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile

इस बारे में कैसे जाना है?


IIUC अपने awk स्क्रिप्ट होना चाहिए: '/<tr/{p=1}; p; /<\/tr>/{p=0}'। कुछ उदाहरण इनपुट और अपेक्षित आउटपुट पोस्ट करें यदि यह काम नहीं करता है।
थोर

चूँकि आपका awkकाम कर रहा है, लेकिन डुप्लिकेट देने से आपके awk के आउटपुट को पास करने की कोशिश की जाती sort -uहै ताकि उन्हें अलग
igiannak

जवाबों:


14

यदि आप केवल ...सभी <tr>...</tr>करना चाहते हैं:

grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE

बहुपरत के लिए:

tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE

HTML की जाँच करें सबसे पहले char "|" (सामान्य नहीं है, लेकिन संभव है) और अगर यह मौजूद है, तो जो मौजूद नहीं है उसे बदल दें।


1
यह तभी काम करेगा जब स्टार्ट और एंड टैग एक ही लाइन पर हों।
l0b0

echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'देता है fooblabarblaवहाँ नहीं होना चाहिए?
एनएन

@ l0b0 सही है। एक बहु-संगत के लिए जाना होगा ...
xx4h

grep -Po '<tr>.*?</tr>'@ एनएन के मामले में प्रति पंक्ति एक परिणाम लौटाएगा, लेकिन यह पोर्टेबल नहीं है।
l0b0

मुझे यकीन नहीं है कि आप 'चश्मे' या 'कल्पना-शैली' से क्या मतलब है, लेकिन ध्यान दें कि आपका वेब ब्राउज़र एक html पार्सर का उपयोग करता है और एक html पार्सर html को पार्स करेगा चाहे वह कैसे भी लिखा हो। यह उन चीजों को पार्स नहीं करेगा जो html नहीं हैं, लेकिन फिर, न तो आपका ब्राउज़र होगा, इसलिए कोई भी "html" लिखने में परेशान नहीं करेगा कि एक पार्सर पार्स नहीं कर सकता है। दूसरे शब्दों में: एक सभ्य पार्सर निश्चित रूप से ऐसा करने के लिए आपकी सबसे अच्छी शर्त है।
गोल्डीलॉक्स

11

आपके पास एक आवश्यकता है जो HTML पार्सर को वारंट करती है: आपको HTML को पार्स करने की आवश्यकता है। पर्ल का एचटीएमएल :: ट्रीब्यूलर , पायथन के ब्यूटीफुल और अन्य का उपयोग करना आसान है, जटिल और भंगुर नियमित अभिव्यक्ति लिखने से आसान है।

perl -MHTML::TreeBuilder -le '
    $html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
    foreach ($html->look_down(_tag => "tr")) {
        print map {$_->as_HTML()} $_->content_list();
    }
' input.html

या

python -c 'if True:
    import sys, BeautifulSoup
    html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
    for tr in html.findAll("tr"):
        print "".join(tr.contents)
' input.html

9

sedऔर awkइस कार्य के लिए अच्छी तरह से अनुकूल नहीं हैं, आपको उचित HTML पार्सर का उपयोग करना चाहिए। उदाहरण के लिए hxselectw3.org से:

<htmlfile hxselect -s '\n' -c 'tr'

मुझे पता नहीं है कि hxselect सबसे अच्छा विकल्प है; मैंने इसका उपयोग नहीं किया है, लेकिन मैन पेज कहता है कि यह "एक अच्छी तरह से गठित XML दस्तावेज़ पढ़ता है" जो कि कई HTML दस्तावेज़ नहीं हैं। शायद एक कोशिश के लायक है। Html parser libs perl, python, et के लिए उपलब्ध है। अल। बेहतर होगा, अगर वह एक विकल्प है।
गोल्डीलॉक्स

2
@goldilocks: सर्वश्रेष्ठ विकल्प स्थिति पर निर्भर करता है। मेरे अनुभव में hxselectअच्छी तरह से गठित html / xml दस्तावेजों के साथ बहुत अच्छा काम करता है। इसके अलावा, यह पर्ल, अजगर और अन्य की तुलना में उपयोग करने के लिए तेज़ है। मुझे लगता hxselectहै कि sed/ awkऔर पार्सर लिबास के बीच एक अच्छा मध्य-मैदान है ।
थोर

1
अगर यह काम करता है कि महान है! मैं सिर्फ TechJack के लिए एक चेतावनी जोड़ रहा था, क्योंकि यह नहीं था - क्योंकि मैंने भी कुछ प्रकार के पार्सर का उपयोग करने की सिफारिश की थी।) प्रोग्रामिंग काम करने वाले निश्चित रूप से अधिक अजीब हैं, लेकिन HTML के रूप में दूरस्थ रूप से पास होने वाली किसी भी चीज़ से निपटना चाहिए।
गोल्डीलॉक्स

थोर, hxselectअच्छा लग रहा है, निश्चित रूप से इसे और अधिक तलाशेगा। धन्यवाद।
टेकजैक

@goldilocks: hxnormalizeगैर-निर्मित html / xml फ़ाइलों का ध्यान रखता है।
टोकलैंड

5

यदि rubyउपलब्ध हो तो आप निम्न कार्य कर सकते हैं

ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file

fileआपकी इनपुट HTML फ़ाइल कहां है। आदेश एक रूबी एक-लाइनर निष्पादित करता है। सबसे पहले, यह से सभी लाइनों पढ़ता है fileऔर उन्हें एक स्ट्रिंग के लिए मिलती है, readlines.join। फिर, स्ट्रिंग से यह चयन के बीच (लेकिन नहीं सहित) कुछ भी <tr>और <\/tr>है कि, एक वर्ण या उससे अधिक समय भले ही नई-पंक्तियों की है [/(?<=<tr>).+(?=<\/tr>)/m]। फिर, यह किसी भी <tr>या </tr>स्ट्रिंग से निकालता है , gsub(/<\/?tr>/, "")(यह नेस्टेड trटैग को संभालने के लिए आवश्यक है )। अंत में, यह, स्ट्रिंग प्रिंट puts

आपने कहा था कि एक html पार्सर आपके लिए वारंट नहीं है, लेकिन इसके साथ नोकोगिरी का उपयोग करना बहुत आसान है rubyऔर यह कमांड को सरल बनाता है।

ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file

-rnokogiriलोड नोकगिरी। Nokogiri::HTML(readlines.join)की सभी पंक्तियों को पढ़ता है filexpath("//tr")प्रत्येक trतत्व को map { |e| e.content }चुनता है और प्रत्येक तत्व के लिए सामग्री को चुनता है, अर्थात जो <tr>और के बीच है </tr>


1

grep

trकई लाइनों में टैग के भीतर सामग्री को पुनः प्राप्त करने के लिए , इसे xargsपहले के माध्यम से पारित करें , उदाहरण के लिए:

curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"

केवल आंतरिक HTML वापस करने के लिए, उपयोग करें:

curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"

perlreविस्तारित पैटर्न के लिए सिंटैक्स की जाँच करें ।

नोट: तेज प्रदर्शन के लिए, आप विचार कर सकते हैं कि ripgrepकिसके समान वाक्यविन्यास हैं।


यह xargs के बिना दिखने वाले अच्छे से मुद्रित हुआ, जैसे कि इनरेप-एक्स "" <स्क्रिप्ट। *? </ script> "का उपयोग करते हुए इनलाइन जावास्क्रिप्ट को खोजने के लिए काम आया
एंड्रयू

0

pup

उदाहरण का उपयोग करना pup(जो सीएसएस चयनकर्ताओं का उपयोग करता है ):

pup -f myfile.html tr

केवल पाठ को टैग के बिना प्रिंट करने के लिए, उपयोग करें pup -f myfile.html tr text{}:।

यहाँ कुछ उदाहरण हैं curl:

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

xpupHTML / XML पार्सिंग के लिए उदाहरण (जो XPath का समर्थन करता है):

xpup -f myfile.html "//tr"

0

अगर यह सिर्फ एक त्वरित लिस्टिंग है तो <tr>इससे मदद मिल सकती है:

perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

चियर्स

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