Sed का उपयोग करके HTML स्रोत से .txt फ़ाइल में grep url की कोशिश करना


1

मैं पहले html स्रोत से यूआरएल की सूची को संक्षिप्त करने के लिए नीचे दिए गए कोड का उपयोग करने में सक्षम रहा हूं, लेकिन किसी कारण से यह इस विशिष्ट उदाहरण के लिए काम नहीं कर रहा है।

ग्रेप:

grep -1 box-download shareit1.txt|sed 's/<a/\/n/'|sed 's/href/\/n/'|grep http|cut -d\" -f2>> shareit2.txt

यूआरएल:

<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl"
        data-ua="#c,#l,a=Download,downloadType=HostedDownload"
    >
    <strong>Free Download
        <span>Safe download</span>
    </strong>
    <i class="icon-download-alt"></i>
</a>

मदद की सराहना करें।


ग्नू ग्रीप के साथ:grep -Poz 'href="\K[^"]*' file.html
साइरस

आपको यह प्राप्त करने में आसानी हो सकती है कि आप क्या आउटपुट प्राप्त करना चाहते हैं lynx -force_html -dump --listonly shareit1.txt
कैस

@ लेवांदाजो: लगता है कि आपको इस साइट से कुछ परेशानी है। मुझे मदद करने दो। प्रत्येक उत्तर के पास, बाईं ओर, चार आइटम हैं। ऊपर से: वोट अप ( ^), संख्या, वोट डाउन ( v) और स्वीकार ( )। आप किसी भी जवाब के लिए वोट डाल सकते हैं। यदि आपको लगता है कि उत्तर अच्छी तरह से लिखित और सहायक है, तो यह वोट के उपयोग के योग्य है ^। आप उत्तर भी स्वीकार कर सकते हैं, लेकिन प्रश्न के लिए केवल एक। उस उत्तर के लिए है जो सभी की उच्चतम गुणवत्ता है या आपकी समस्या को सीधे हल करता है।
मिरेक डेलुगोज़

जवाबों:


0
sed 's/^[^"]*  *//
     s/" */"\n/2
      /\n/P;D
'    <in >out

यह एक बार में इनपुट लाइनों को एक डबल-कोटेड संदर्भ मुद्रण और खाने पर ले जाएगा। यह संभवतः आपके डेटा को बहुत अधिक grepअनुकूल बना देगा। जैसा कि लिखा गया है कि यह काम नहीं करता है यदि उद्धृत संदर्भ नए बिंदुओं को फैला सकते हैं, लेकिन, जैसा कि मैं इसे समझता हूं, वे HTML में नहीं होने चाहिए।

वैसे भी, यह आपके नमूने को संभालने में बहुत आसान बनाता है:

class="box-download"
data-no-file="0"
title="SHAREit free download"
href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe"
id="download-button"
class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
class="icon-download-alt"

1

इसके साथ (निश्चित) file.html:

<html>
  <div class="box-download">
    <a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl" data-ua="#c,#l,a=Download,downloadType=HostedDownload">
      <strong>Free Download<span>Safe download</span></strong>
      <i class="icon-download-alt"></i>
    </a>
  </div>
</html>

कमान:

xmlstarlet sel -t -v "//html/div/a/@href" file.html

आउटपुट:

http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename = LenovoShareIt-win.exe

XPath का उपयोग करना एकमात्र सही तरीका है, लेकिन मुझे डर है कि HTML सामग्री को "ठीक करने" की आवश्यकता इसमें कटौती नहीं करेगी। ओपी द्वारा प्रदान की गई सामग्री को जोड़ना <html>और </html>उसके आस - पास उपलब्ध करना उचित है, लेकिन यह संभवतः पूरे पृष्ठ का स्रोत नहीं है। तो आपको पहले उसे निकालना होगा <div>। आप शायद उपयोग नहीं कर सकते xmlstarlet, क्योंकि कुछ अन्य भागों में "फिक्सिंग" की आवश्यकता हो सकती है। दूसरी ओर, सरल grep उन लाइनों की चर संख्या को संभाल नहीं पाएगा जो फैल <div>सकती हैं। यह चिकन-एंड-एग समस्या की तरह है और यह दर्शाता है कि शेल टूलसेट HTML सामग्री को संभालने के लिए बहुत उपयुक्त नहीं है।
Mirek Długosz

धन्यवाद @ MirosławZalewski जैसा कि आपने कहा, मुझे शेल टूलसेट के साथ समस्या हो रही है, html को संभालने का एक बेहतर तरीका DOMXPath प्रतीत होता है।
लेवांडाजो

0

यह काम नहीं कर सकता है, क्योंकि आपके पास स्लैश पीछे की ओर है (जब तक कि स्टैकएक्सचेंज पार्सर चीजों को गड़बड़ नहीं करता है)। आपने यह पता लगा लिया है कि विशेषता सामग्री का चयन करने के लिए, आप इसे नई पंक्ति में रखेंगे और वहाँ से काट लेंगे। लेकिन न्यूलाइन चरित्र है \n, नहीं \/n। दूसरा एक है " /n, यह सुनिश्चित करना कि आगे की स्लैश का शाब्दिक इलाज किया गया है"।

तो यह कोड, फिक्स के बाद, काम करेगा:

grep -1 box-download shareit1.txt|sed 's:<a:\n:'|sed 's/href/\n/'|grep http |cut -d\" -f 2

यद्यपि आप पूरी तरह से भरोसा करके बाहरी कार्यक्रमों के पाइप और चालान की संख्या में कटौती कर सकते हैं sed:

sed -n -e '/http/ s:.*href="\([^"]*\)".*:\1: p' shareit1.txt

साइड नोट पर, ये सभी दृष्टिकोण वैसे भी गलत हैं। सही तरीका DOM / XPath का उपयोग कर रहा है। समस्या यह है कि शेल के लिए कोई डोम पार्सर नहीं है (जो मुझे पता है) और सामान्य शेल एक्सएमएल पार्सर्स जो एक्सपीथ एक्सप्रेशन को निर्दिष्ट करने की अनुमति देते हैं फ़ाइल को वैध एक्सएमएल होने की उम्मीद करते हैं - जो कि वेबसाइट की सामग्री लगभग कभी नहीं होती है। अन्य प्रोग्रामिंग भाषाओं में, जैसे पायथन, रूबी या पर्ल (सिस्टम व्यवस्थापक के लिए सबसे सामान्य लोगों का उल्लेख करने के लिए), ऐसे पुस्तकालय हैं जो गंदी HTML फ़ाइल को कुछ ऐसी चीज़ों में बदल देंगे जो वैध XML फ़ाइल से मिलती जुलती हैं और जिसे XML पार्सर में खिलाया जा सकता है।


धन्यवाद फिर से, यह एक इलाज का काम करता है। मुझे प्रोग्राम को डाउनलोड करने के लिए निकाले गए url का उपयोग करने की आवश्यकता है, wget वैरिएबल का उपयोग करते हुए क्योंकि मैं बहुत सारे प्रोग्राम डाउनलोड कर रहा हूँ। चर के रूप में इसे सहेजने वाले फ़ाइल नाम की भी आवश्यकता होगी, यह कैसे करना है पर कोई सुझाव?
लेवांदाजो

यदि सर्वर ठीक से कॉन्फ़िगर किया गया है, तो स्वचालित रूप से सही फ़ाइल नाम के तहत डेटा को सहेजना चाहिए। यदि यह नहीं है, तो कोशिश करें --trust-server-namesऔर / या --content-dispositionविकल्प। इस विशेष उदाहरण में, आप फ़ाइल नाम का उपयोग करके \/\([^/?]*?\)\?(अंतिम स्लैश और प्रश्न चिह्न के बीच) या .*=\(.*\)$(अंतिम बराबर चिह्न के बाद एक के लिए ) निकाल सकते हैं । यदि URL पहले से ही परिवर्तनशील है $URL, तो इस तरह से कुछ का उपयोग करें: echo "$URL" |sed -e 's:.*=\(.*\)$:\1:'(अप्रयुक्त, जैसा कि मैं अभी लिनक्स पर नहीं हूं)।
Mirek Długosz

इसके अलावा, उन उत्तरों के पास तीर पर क्लिक करना न भूलें जो आपको उपयोगी लगते हैं और उत्तर स्वीकार करते हैं कि आप ... अच्छी तरह से स्वीकार करते हैं
Mirek Długosz

0

आप lynx -dump --list-onlyHTML इनपुट से URL की सूची निकालने के लिए उपयोग कर सकते हैं ।

आप पहले से ही नहीं है, तो lynxस्थापित है, तो आप इसे का उपयोग कर जो भी तंत्र अपने लिनक्स या यूनिक्स प्रणाली (जैसे के लिए सामान्य है स्थापित करने के लिए होगा apt-get, yum, make install, आदि)

जैसे

$ lynx -force_html -dump --listonly shareit1.txt | awk '/^ *[0-9]+\. / { print $2}'
http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe

0

आप पिल्ला का उपयोग कर सकते हैं ; यह एक अद्भुत उपकरण है।

यहां, देखें कि मैं किसी फ़ाइल को कैसे डाउनलोड करता हूं और फिर HTML के अंदर से किसी फ़ाइल में विशेष लिंक जोड़ता हूं।

wget http://domain.com -O file.html && pup 'a.className[href] attr{href}' < file.html > links.md

डोमेन नाम के साथ Domain.com पर सभी लिंक classNameडाउनलोड और नामक एक फ़ाइल में सहेजे जाएंगे links.md

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