पर्ल डब्ल्यूडब्ल्यूडब्लू :: मैकेनाइजेशन - एचटीएमएल को एक मूल रिपोर्ट में पार्स करना

मेरे पास एक ऐसी स्क्रिप्ट है जो एक वेब पेज को डाउनलोड करती है और फिर नीचे की ओर पार्स करती है इस तरह के यूआरएल की एक सूची

26165
29327
29416
29450

मैं उन्हें और नीचे स्ट्रिप करता हूं और टिकट URL को सरणी @url_list में लोड करता हूं और फिर उनसे कुछ जानकारी निकालता हूं

#!/usr/bin/perl 
use WWW::Mechanize;
use LWP;

my $username = 'casper';
my $password = 'casper';

my $mech = WWW::Mechanize->new();
$mech->cookie_jar(HTTP::Cookies->new());
$mech->get('http://ticketmaster/wonk.dll?ReportPage&Template=reports%2Flist&TableId=1023&Target=Query&QueryName=-6&SolutionId=8') || die "can't reach the website $!";
$mech->form_name('theform');
$mech->field('ttAuthUID' => $username);
$mech->field('ttAuthPWD' => $password);
$mech->click('Action');

print $mech->save_content(raw_teamtrack);

open(my $webpage, "<", "raw_teamtrack") || die "cannot open up the out file $!";

while (<$webpage>) {
  chomp;
  $link = $_;
  if ($link =~ /new();
  $mech->cookie_jar(HTTP::Cookies->new());
  $mech->get("http://ticketmaster/$url")
      || die "cannot load the ticket page $!";
  $mech->form_name('theform');
  $mech->field('ttAuthUID' => $username);
  $mech->field('ttAuthPWD' => $password);
  $mech->click('Action');
  print $mech->save_content(raw_ticket);
  open(my $ticketpage, "<", "raw_ticket")
      || die "cannot open up the out file $!";

  while (<$ticketpage>) {
    chomp;
    if (/Item\sId:\s+?<\/B>(\d{5})/) { $Item_number = $1; } elsif (/Owner:\s<\/B>(.*)
/) { $Owner = $1; } else { $ticket_title =~ /Title:\s<\/B>(.*)/; print "$Item_number $Owner $ticket_title\n"; sleep 1; } } }

समस्या यह है कि यह केवल आइटम संख्या और मालिक फ़ील्ड को प्रिंट करता है; यह टिकट शीर्षक मुद्रित नहीं करता है।

साथ ही, यह प्रत्येक पुनरावृत्ति के लिए एक बार जानकारी को प्रिंट करता है - टिकट में प्रत्येक HTML लाइन के लिए यह डाउनलोड होता है।

यह हर समय मेरे साथ होता है: मुझे आमतौर पर लूप को ब्रांड्स से बाहर ले जाना होता है। यह हल करता है, लेकिन एक मौलिक परिप्रेक्ष्य से मुझे समझ में नहीं आता कि इसे लूप के बाहर क्यों ले जाना इसे ठीक करता है। HTML की प्रत्येक पंक्ति के लिए प्रिंटिंग क्यों हो रही है, जहां यह अभी है?

मुझे यह भी समझ में नहीं आता कि क्यों $ स्वामी मुद्रित नहीं किया गया है। क्या else के साथ कुछ चल रहा है? क्या मुझे एक और <�कोड> अगर कथन का उपयोग करना चाहिए?

26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
29327   George Glass
29327   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29753   Herley Lee
29753   Herley Lee  
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee

regexes अच्छे हैं।

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Item\sId:\s+?<\/B>(\d{5})/' | sort -u
29871

 bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Owner:\s<\/B>(.*)
/' | sort -u Jimmy Jack bash-3.00$ bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Title:\s<\/B>(.*)/' | sort -u Trade Capture Prod Shadow - Install software on ushs2 - 11/15/13 bash-3.00$

मैं HTML कोड को जोड़ नहीं सकता था जिसे मैं यहां तोड़ने की कोशिश कर रहा हूं क्योंकि यह HTML है और प्रारूपण नहीं कर रहा था कृपया यह पेस्टबकेट </एक>।

0
@ बोरोडिन - हे - इस पर ध्यान देने के लिए धन्यवाद - मैंने यह सूटआईसब्लैक नोट सुझाव लिया और नीचे फोरचलोप के साथ क्या गलत है यह जानने के लिए कुछ और समय लगाया। मैं इसे थोड़ी देर के लूप से बाहर ले गया। हाँ - कोड की प्रतिकृति के बारे में- मुझे इसे काम करने में परेशानी थी और पूरे कोड को दोहराने के लिए समाप्त हो गया। मैं चुनिंदा चीजों को चुनने जा रहा हूं और इसे चलाने के लिए जारी रखूंगा। मैं स्वयं सिखाया जाता हूं और आप निश्चित रूप से मेरी शिक्षा में छेद देख सकते हैं।
जोड़ा लेखक capser, स्रोत
@ बोरोडिन - यदि आप अपने हाथीदांत टावर में बैठना चाहते हैं और मेरी स्क्रिप्ट पर पॉट शॉट लेना चाहते हैं - ठीक है। लेकिन अगर आप पर्ल भाषा जितना करते हैं उतना प्यार करते हैं, तो आपको कुछ समझना चाहिए। आप मेरे जैसे लोगों के बारे में शिकायत कर सकते हैं, लेकिन मैं इस भाषा को जीवित रखने वाला लड़का हूं - आप नहीं। क्योंकि मैं एक जीवित रहने के लिए और पर्ल के साथ काम करके काम करता हूं, मैं इसे व्यवहार्य और जिंदा रख रहा हूं। आप एक विशेषज्ञ हैं लेकिन नए अनुयायियों के प्रति आपका दृष्टिकोण उन्हें पाइथन जैसे अच्छी भाषाओं में चला रहा है। इसे बोरोडिन रखें और एक दिन सभी पर्ल कोड साफ हो जाएंगे, और लैटिन की तरह - स्
जोड़ा लेखक capser, स्रोत
@ बोरोडिन - भाषा को जीवित रखने के लिए - मैं वॉल स्ट्रीट पर काम करता हूं, मैं वैज्ञानिक नहीं हूं, लेकिन मुझे रुझानों को समझने के लिए प्रशिक्षित किया गया है। छोटी शुरुआतएं पर्ल के साथ कुछ भी नहीं करना चाहती हैं। पाइथन आसान है और जब वे एक अजगर प्रश्न ऑनलाइन पूछते हैं तो वे फ्लेम नहीं होते हैं। मेरे संगठन के संदर्भ में मैं इसे एक पर्ल दुकान रखने के लिए काम कर रहा हूं। मैं पर्ल को जिंदा रख रहा हूं। लेकिन एक विशेषज्ञ के रूप में, उन लोगों को फाड़कर जो मंच पर अलग-अलग स्तर पर नहीं हैं - आप पर्ल को जीवित रखने में मदद नहीं कर रहे हैं, आप लोगों को दूर चला रहे हैं। यदि शुरुआती आपको परेशान करते हैं तो शायद
जोड़ा लेखक capser, स्रोत
मैंने आपके पर्ल कोड को सूचित किया है ताकि यह थोड़ा और पठनीय हो, लेकिन कृपया अपने प्रोग्राम की शुरुआत में सख्त और चेतावनियों का उपयोग करें जोड़ें और आपको प्राप्त त्रुटियों को ठीक करें उसमें से। जब आप पर्ल प्रदान करते हैं तो मूल उपकरण का उपयोग नहीं करते हैं, तो दूसरों से सहायता की अपेक्षा करना उचित नहीं है।
जोड़ा लेखक Borodin, स्रोत
आपने के लिए लूप के अंदर अपना बहुत कोड दोहराया है, जिसमें use कथन शामिल हैं और अपना उपयोगकर्ता नाम और पासवर्ड चर सेट अप करना शामिल है। यह स्पष्ट होना चाहिए कि इसे एक से अधिक बार करने की आवश्यकता नहीं है, और आपका दृष्टिकोण स्पष्ट सोच से अनुमान लगाने जैसा लगता है।
जोड़ा लेखक Borodin, स्रोत
क्या वह डेटा है जिसे आपने pastebucket raw_teamtrack की सामग्री पर पोस्ट किया है?
जोड़ा लेखक Borodin, स्रोत
मुझे आपके प्रश्न को बंद करने के लिए मतदान करना पड़ा है। यदि आप एक प्रोग्राम प्रदान नहीं कर सकते हैं जिसे हम देख सकते हैं और जो समस्या आप देख रहे हैं उसे देख सकते हैं तो हम वास्तव में मदद नहीं कर सकते हैं।
जोड़ा लेखक Borodin, स्रोत
आपको वास्तव में इस कोड को ठीक करने में मदद के लिए नहीं पूछना चाहिए। आपने अनुमानों से इसे इकट्ठा किया है, और यह एक प्रोग्राम को एक साथ रखने का सही तरीका कभी नहीं है। आपको अपने कोड में प्रत्येक पंक्ति के व्यवहार और उद्देश्य, और अंततः प्रत्येक चरित्र को समझाने में सक्षम होना चाहिए। आप केवल बिट्स नहीं जोड़ सकते हैं और इसे सही तक तब तक दबा सकते हैं, जैसे कि यह प्ले-दोह था।
जोड़ा लेखक Borodin, स्रोत
@ ब्रैड गिल्बर्ट: आपकी टिप्पणी के लिए धन्यवाद। हां, जब आप जानवर को समझने की कोशिश कर रहे हैं, तो आप इसे दबा सकते हैं और देख सकते हैं कि यह क्या है। लेकिन यह उस कोड की शर्त नहीं होनी चाहिए जिसके बारे में आप मदद मांग रहे हैं। आपके पास पहले से ही स्पू की बाल्टी होनी चाहिए जो आपको न्यायित समाधान पर ले जाती है जो काफी काम नहीं करती है। आपको ब्लैक-बॉक्स कॉल को गलत समझा जाना चाहिए, या समांतर संदर्भ में समय विचारों को भूलना चाहिए, या ... आदि। लेकिन नहीं प्रोग्राम के लिए उपयोग की जाने वाली भाषा को गलत समझना चाहिए।
जोड़ा लेखक Borodin, स्रोत
मुझे उम्मीद थी कि मेरी टिप्पणियां आपके सभी प्रोग्रामिंग को बेहतर बनाने के लिए प्रोत्साहन के रूप में पढ़ी जाएंगी। मुझे बहुत संदेह है कि आप पर्ल को जिंदा रख रहे हैं, क्योंकि ऐसा नहीं लगता कि आपके पास इसका लटका है। मुझे पूरा यकीन है कि आपकी सबसे बड़ी गलती यह है कि आप डीबगिंग शुरू करने से पहले बहुत अधिक कोड लिखने के लिए चिपके हुए हैं। पर्ल की छः या आठ लाइनें यह सुनिश्चित करने के लिए बहुत हैं कि आपका वेश्यात्मक कार्यक्रम काम कर रहा है। यही कारण है कि मौजूदा कोड को बनाए रखने के लिए सॉफ्टवेयर को स्क्रैच से लिखना इतना आसान है: शुरू करने से पहले आपको पूरी चीज़ को अवशोषित करना और समझना होगा।
जोड़ा लेखक Borodin, स्रोत
सटीक इनपुट को देखे बिना आप प्रसंस्करण कर रहे हैं, मदद करना मुश्किल है। आपके अंतिम कोड ब्लॉक में, आपने फ़ाइल का उपयोग करके अपने regexes का परीक्षण किया; कृपया WWW :: मैकेनाइजेशन कोड के समूह की बजाय उस फ़ाइल की सामग्री पोस्ट करें जो शायद आपके वास्तविक मुद्दे से संबंधित नहीं है। यदि आप एक सरल, आत्मनिर्भर उदाहरण बनाते हैं, तो इसे डीबग करना बहुत आसान होगा और आपको शायद एक उत्तर तेज मिलेगा (यदि आपको प्रक्रिया में स्वयं को नहीं मिला है)।
जोड़ा लेखक ThisSuitIsBlackNot, स्रोत
@ बोरोडिन आप कहते हैं कि " बिट्स और पॉक जोड़ें जब तक कि यह सही न हो ", लेकिन यह बिल्कुल ठीक है कि मैंने प्रोग्राम कैसे सीखा। बेशक अब मुझे आमतौर पर ऐसा नहीं करना पड़ता है। (मैं विज्ञापन-प्रसार फ़ाइलों को संसाधित करने की कोशिश करते समय इस तरह से काम करता हूं, क्योंकि इसे किसी अन्य तरीके से लिखना लगभग असंभव है।) मुझे लगता है कि आपने अपनी राय को थोड़ा कठोर बताया था, भले ही मैं कुछ हद तक सहमत हूं। यदि आप इसे करने का गलत तरीका भी नहीं जानते हैं, तो सही तरीके से प्रोग्राम को जानना बहुत मुश्किल है।
जोड़ा लेखक Brad Gilbert, स्रोत

1 उत्तर

मुझे इस बात पर संदेह है कि आप कथन के साथ मिलान करने वाले पैटर्न हैं और एक परिवर्तनीय $ 1 असाइन करते हैं (आपके कोड में अंतिम रेगेक्स चेक/असाइनमेंट गलत है)। निम्नलिखित उदाहरण के लिए परीक्षण डेटा पर निम्न कार्य करता है (इसलिए टिकट शीर्षक कम से कम मुद्रित किया जाएगा, यूआरएल के सेट के बिना लूप के बारे में निश्चित नहीं है)।

तो मैं इस तरह से मेल खाता हूँ ...

use strict;
use warnings; # always use these at top

....

my $Item_number;
my $Owner;
my $ticket_title;

while (<$webpage>) {
    my $line = $_;
    chomp;
    $line =~ /Item\sId:\s+?<\/B>(\d{5})/ and $Item_number = $1;
    $line =~ /Owner:\s<\/B>(.*)
/ and $Owner = $1; $line =~ /Title:\s<\/B>(.*)/ and $ticket_title = $1; } print "$Item_number $Owner $ticket_title\n";

कोड में कई अन्य मुद्दे हैं, लेकिन बस समस्या को संदेह करने के लिए बस अलग करने की कोशिश कर रहा है। जब आप परीक्षण करने के लिए केवल एक रेगेक्स करते हैं, तो यह ठीक काम करेगा, इसलिए रेगेक्स अलगाव में ठीक है। जब आप एक दूसरे के बाद एक दूसरे regexes संयोजन कर रहे हैं असंगत है।

जिस तरह से यह काम करता है उसे स्पष्ट करने के लिए, 'और' शॉर्टकट की तरह है, इसलिए इस मामले में रेगेक्स सत्य होने पर असाइनमेंट केवल निष्पादित किया जाता है।

0
जोड़ा
अरे - धन्यवाद यह वास्तव में मैं क्या देख रहा था - बेहतर रूप पर सुझाव।
जोड़ा लेखक capser, स्रोत