দুটি ট্যাগের মধ্যে পাঠ্য


23

এই দুটি ট্যাগের মধ্যে যা আছে তা আমি পুনরুদ্ধার করতে চাই - <tr> </tr>- এইচটিএমএল ডক থেকে। এখন আমার কাছে কোনও নির্দিষ্ট এইচটিএমএল প্রয়োজনীয়তা নেই যা এইচটিএমএল পার্সারের জন্য ওয়ারেন্ট দেয়। আমার কেবল সাদামাটা কিছু দরকার যা মেলে <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কাজ করছেন কিন্তু ডুপ্লিকেট দিচ্ছেন তা আপনার sort -u
স্বাচ্ছন্দ্যের

উত্তর:


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

"|" চরের প্রথমে এইচটিএমএল ফাইলটি পরীক্ষা করে দেখুন (স্বাভাবিক নয়, তবে সম্ভব) এবং যদি এটি বিদ্যমান থাকে তবে এমন একটিতে পরিবর্তন করুন যা বিদ্যমান নেই।


1
এটি কেবল তখনই কাজ করবে যদি শুরু এবং শেষ ট্যাগগুলি একই লাইনে থাকে।
l0b0

echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'দেয় fooblabar। সেখানে blaথাকা উচিত নয়?
এনএন

@ l0b0 সঠিক। একটি
বহু

grep -Po '<tr>.*?</tr>'@ এনএন এর ক্ষেত্রে প্রতি লাইনে একটি ফলাফল ফেরত দেবে, তবে এটি বহনযোগ্য নয়।
l0b0

আপনি 'স্পেস' বা 'স্পেক-স্টাইল' বলতে কী বুঝছেন তা নিশ্চিত নই তবে নোট করুন যে আপনার ওয়েব ব্রাউজারটি এইচটিএমএল পার্সার ব্যবহার করে এবং এইচটিএমএল পার্সার এটি কীভাবে লেখা হোক না কেন এইচটিএমএলকে বিশ্লেষণ করবে। এটি এইচটিএমএল নয় এমন জিনিসগুলির বিশ্লেষণ করবে না তবে তারপরেও আপনার ব্রাউজারটি হবে না, সুতরাং কেউ "এইচটিএমএল" লিখতে বিরক্ত করবে না যে কোনও পার্সার পার্স করতে পারে না। অন্য কথায়: একটি শালীন পার্সার অবশ্যই এটি করার জন্য অবশ্যই আপনার সেরা বাজি।
স্বর্ণলোক

11

আপনার এমন কোনও প্রয়োজন রয়েছে যা এইচটিএমএল বিশ্লেষককে পরোয়ানা দেয়: আপনার এইচটিএমএল পার্স করতে হবে। পার্ল এর এইচটিএমএল :: TreeBuilder , পাইথন এর BeautifulSoup এবং অন্যদের, ব্যবহার করা সহজ হয় জটিল এবং ভঙ্গুর রেগুলার এক্সপ্রেশনের লেখার তুলনায় অনেক সহজ।

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এই কাজের জন্য উপযুক্ত নয়, আপনার পরিবর্তে একটি সঠিক এইচটিএমএল পার্সার ব্যবহার করা উচিত। উদাহরণস্বরূপ hxselectw3.org থেকে:

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

Hxselect সেরা পছন্দ হলে আমি dunno; আমি এটি ব্যবহার করি নি তবে ম্যান পেজটি বলে যে এটি "একটি সুগঠিত এক্সএমএল ডকুমেন্ট পড়ে" যা অনেক এইচটিএমএল নথি নয়। সম্ভবত একটি চেষ্টা মূল্য। পার্ট, পাইথন, এবং এর জন্য এইচটিএমএল পার্সার উপলব্ধ। অল। এটি আরও ভাল হবে, যদি এটি বিকল্প হয়।
স্বর্ণলোক

2
@ গোল্ডিলোকস: সর্বোত্তম পছন্দ পরিস্থিতিটির উপর নির্ভর করে। আমার অভিজ্ঞতার hxselectসাথে এইচটিএমএল / এক্সএমএল ডকুমেন্টগুলি সুগঠিত রয়েছে good এছাড়াও, পার্ল, অজগর এবং অন্যান্যদের চেয়ে এটি ব্যবহার করা দ্রুত। আমার মনে hxselectহয় sed/ awkএবং পার্সার লিবসের মধ্যে একটি ভাল মধ্যম স্থল ।
থোর

1
এটি যদি কাজ করে তবে দুর্দান্ত! আমি টেকজ্যাকের ক্ষেত্রে কেবল একটি ক্যাভিয়েট যুক্ত করছিলাম যদি তা না ঘটে - যেহেতু আমি কোনও ধরণের পার্সার ব্যবহার করার পরামর্শও দিয়েছিলাম;) প্রোগ্রামিং লিবগুলি অবশ্যই আরও বিশ্রী হয় তবে এইচটিএমএল হিসাবে দূরবর্তীভাবে পাসযোগ্য কোনও বিষয় নিয়ে কাজ করা উচিত।
স্বর্ণলোক

কিছু hxselectভাল লাগছে, অবশ্যই এটি আরও অন্বেষণ করবে। ধন্যবাদ।
টেকজ্যাক

@ গল্ডিলোকস: hxnormalizeএইচটিএমএল / এক্সএমএল সুসংহত নয় এমন ফাইলগুলির যত্ন নেয়।
টোকল্যান্ড

5

যদি rubyপাওয়া যায় তবে আপনি নিম্নলিখিতটি করতে পারেন

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

fileআপনার ইনপুট এইচটিএমএল ফাইল কোথায় ? কমান্ডটি একটি রুবি ওয়ান-লাইনার কার্যকর করে। প্রথমত, এটি সমস্ত লাইন পড়ে fileএবং সেগুলিতে একটি স্ট্রিংয়ে যোগ দেয় readlines.join,। তারপরে, স্ট্রিং থেকে এটি (তবে অন্তর্ভুক্ত নয়) এর মধ্যে যে কোনও কিছু বাছাই করে <tr>এবং <\/tr>এটি একটি চরিত্র বা লম্বালম্ব নির্বিশেষে [/(?<=<tr>).+(?=<\/tr>)/m],। তারপরে, এটি কোনও <tr>বা </tr>স্ট্রিং থেকে সরিয়ে দেয় gsub(/<\/?tr>/, "")(নেস্টেড trট্যাগগুলি হ্যান্ডেল করার জন্য এটি প্রয়োজনীয় )। অবশেষে, এটি স্ট্রিং প্রিন্ট করে puts,।

আপনি বলেছিলেন যে এইচটিএমএল পার্সার আপনার জন্য ওয়্যারেন্টেড নয় তবে এটি দিয়ে নোকোগিরি ব্যবহার করা খুব সহজ 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>"

কেবল অভ্যন্তরীণ এইচটিএমএল ফিরিয়ে আনতে, ব্যবহার করুন:

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

perlreবর্ধিত নিদর্শনগুলির জন্য বাক্য গঠন পরীক্ষা করুন ।

দ্রষ্টব্য: তাত্ক্ষণিক পারফরম্যান্সের জন্য, আপনি বিবেচনা করতে পারেন ripgrepযার মধ্যে একই ধরনের বাক্য গঠন রয়েছে।


এটি জার্গাগুলি ছাড়াই ভাল প্রিন্ট করে মুদ্রিত হয়েছিল, উদাহরণস্বরূপ - <"স্ক্রিপ্ট। *? </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

xpupএইচটিএমএল / এক্সএমএল পার্সিংয়ের জন্য ব্যবহারের উদাহরণ (যা এক্সপথ সমর্থন করে):

xpup -f myfile.html "//tr"

0

এটি যদি কেবলমাত্র একটি দ্রুত তালিকার তালিকা থাকে তবে এটি <tr>সহায়তা করতে পারে:

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

চিয়ার্স

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