2009-11-07 6 views
5

जब से मैंने पूछा कि रेगेक्स के साथ एचटीएमएल को कैसे पार्स किया जाए और थोड़ा सा (सही तरीके से) मिला, तो मैं HTML::TreeBuilder, HTML::Parser, HTML::TokeParser, और HTML::Elements पर्ल मॉड्यूल का अध्ययन कर रहा हूं।मुझे पर्ल के एचटीएमएल मॉड्यूल का उपयोग करके एक div की सामग्री कैसे मिल सकती है, अगर मुझे इसके अंदर एक टैग पता है?

मैं इस तरह HTML है:

<div id="listSubtitlesFilm"> 
    <dt id="a1"> 
    <a href="/45/subtitles-67624.aspx"> 
     .45 (2006) 
    </a> 
    </dt> 
</div> 

मैं /45/subtitles-67624.asp पार्स आउट करना चाहते हैं, लेकिन अधिक महत्वपूर्ण मुझे पता है कि div की सामग्री को पार्स आउट करने के लिए कैसे करना चाहते हैं।

मैं एक पिछले प्रश्न पर इस उदाहरण दिया गया था:

while (my $anchor = $parser->get_tag('a')) { 
    if (my $href = $anchor->get_attr('href')) { 
#http://subscene.com/english/Sit-Down-Shut-Up-First-Season/subtitles-272112.aspx 
     push @dnldLinks, $1 if $href =~ m!/subtitle-(\d{2,8})\.aspx!; 
    } 

यह है कि के लिए पूरी तरह से काम किया है, लेकिन जब मैं इसे थोड़ा संपादित करें और पर इसका इस्तेमाल करने की कोशिश की एक `` div` यह काम नहीं किया ।

मैं इस कोड का उपयोग करने की कोशिश की:: यहाँ कोड मैंने कोशिश की है

while (my $anchor = $p->get_tag("dt")) { 
    if($stuff = $anchor->get_attr('a1')) { 
    print $stuff."\n"; 
    } 
} 
+0

खेद है! इसे अपडेट किया गया! – Codygman

+1

आप वास्तव में किस मॉड्यूल का उपयोग कर रहे हैं? आप अपने प्रश्न में पांच की तरह उल्लेख करते हैं, HTML :: TreeParser जैसी कोई चीज़ नहीं है, और आपका कोड HTML :: TreeBuilder के लिए ऐसा नहीं दिखता है ... – hobbs

+0

मैं एचटीएमएल :: टॉकपार्सर :: सरल का उपयोग कर रहा हूं .. भ्रम के लिए खेद है – Codygman

उत्तर

5

समाधान के लिए, अपने विशिष्ट सवाल है, दिया गया HTML:

<div id="listSubtitlesFilm"> 
    <dt id="a1"> 
    <a href="/45/subtitles-67624.aspx"> 
     .45 (2006) 
    </a> 
    </dt> 
</div> 

मैं यह सोचते हैं रहा एंकर पाठ में रुचि रखते हैं, यानी ".45 (2006)", इस मामले में, लेकिन केवल लंगर में होता है, तो आईडी listSubtitlesFilm आईडी के साथ div

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::TokeParser::Simple; 

my $parser = HTML::TokeParser::Simple->new(handle => \*DATA); 

my @dnldLinks; 

while (my $div = $parser->get_tag('div')) { 
    my $id = $div->get_attr('id'); 
    next unless defined($id) and $id eq 'listSubtitlesFilm'; 

    my $anchor = $parser->get_tag('a'); 
    my $href = $anchor->get_attr('href'); 
    next unless defined($href) 
     and $href =~ m!/subtitles-(\d{2,8})\.aspx\z!; 
    push @dnldLinks, [$parser->get_trimmed_text('/a'), $1]; 
} 

use Data::Dumper; 
print Dumper \@dnldLinks; 


__DATA__ 
<div id="listSubtitlesFilm"> 
    <dt id="a1"> 
    <a href="/45/subtitles-67624.aspx"> 
     .45 (2006) 
    </a> 
    </dt> 
</div> 

आउटपुट:

 
$VAR1 = [ 
      [ 
      '.45 (2006)', 
      '67624' 
      ] 
     ]; 
+0

विस्तृत स्पष्टीकरण सिनन के लिए बहुत बहुत धन्यवाद! तुम मुझे प्यार प्यार करते हो! : पी – Codygman

1

get_attr('a1') होना चाहिए शायद get_attr('id') पढ़ सकते हैं और इसे प्रिंट होगा "A1"

मैं हो रही है लगता है कि पाठ्य सामग्री कैसा लगेगा :

while (my $anchor = $parser->get_tag('div')) { 
    my $content = $parser-get_text('/div'); 
} 

या यदि आप उस लिंक का पाठ सामग्री का मतलब यह होगा:

0,123,
while (my $anchor = $parser->get_tag('a')) { 
    if (my $href = $anchor->get_attr('href')) { 
     my $content = $parser->get_text('/a'); 
#http://subscene.com/english/Sit-Down-Shut-Up-First-Season/subtitle-272112.aspx 
     push @dnldLinks, $1 if $href =~ m!/subtitle-(\d{2,8})\.aspx!; 
    } 
+0

धन्यवाद, इससे मदद मिली, प्रश्न के दूसरे भाग में यह है कि

GETTHISCONTENT
के बीच के पाठ को कैसे प्राप्त किया जाए। क्या आप इससे मदद कर सकते हैं? धन्यवाद! – Codygman

+1

मदद के लिए धन्यवाद, भ्रम के लिए खेद है, मुझे लगता है कि यहां कम है। मेरा समग्र लक्ष्य उस निर्दिष्ट डिवी कंटेनर में

टैग से एक href लिंक प्राप्त करना है। – Codygman

1

आपको get_attr("a1") से get_attr("id") को बदलने की आवश्यकता है। get_attr (x)x नाम के साथ एक विशेषता की तलाश में है, लेकिन आप इसे विशेषता का मान दे रहे हैं, न कि उसका नाम।

संयोग से <dt> टैग <div> नहीं है, यह <dl> (परिभाषा सूची) के लिए आइटम टैग है।

4

कोड HTML::TreeBuilder का उपयोग कर:

use HTML::TreeBuilder; 

my $tree = HTML::TreeBuilder->new_from_content($html); 

for my $link ($tree->look_down(
    _tag => 'a', 
    href => qr{/subtitle-\d{2,8}\.aspx}) 
) { 
    my $linkid = $link->attr('href') =~ m!/subtitle-\d{2,8}\.aspx!; 
    # Scalar context gets the first, and the first is the nearest parent 
    my $parent_div = $link->look_up(_tag => 'div'); 
    # Now the interesting bit of the link is in $linkid, the parent div ID 
    # is $parent_div->id or $parent_div->attr_id, and its text is e.g. 
    # $parent_div->as_trimmed_text or you can do other stuff with its content. 
} 
+0

मेरी इच्छा है कि मैं वोट दे सकता हूं! :) धन्यवाद, मैं आपको बहुत परेशान करने की कोशिश नहीं करता, लेकिन इसे समझने की कोशिश करने के एक घंटे बाद मैं बहुत निराश था! – Codygman

+0

विभिन्न पार्सर सबक्लास विभिन्न प्रकार के काम के लिए सभी अच्छे हैं। टॉकपार्सर सबसे सरल और सबसे तेज़ है, लेकिन जब आप टैग स्ट्रक्चर में ऊपर और नीचे जाना चाहते हैं, तो TreeBuilder इसके बजाय आपके दिमाग पर होना चाहिए। – hobbs

+1

और मैं जोरदार * नहीं * वोटों के लिए भीख मांग रहा हूं, लेकिन अब आपके पास 21 प्रतिनिधि हैं और यदि आप चुनते हैं तो मुझे ऊपर उठा सकते हैं, और यदि आप संतुष्ट हैं तो आपको अपने प्रश्न के उत्तरों में से एक को "स्वीकार" करना चाहिए। – hobbs

5

आप इस्तेमाल कर सकते हैं (अभी तक एक और मॉड्यूल!) HTML::TreeBuilder::XPath है, जो, जैसा कि इसके नाम के अनुसार, आप HTML :: TreeBuilder वस्तुओं पर XPath का उपयोग करने देगा।

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::TreeBuilder::XPath; 

my $root = HTML::TreeBuilder::XPath->new_from_file("my.html"); 

# print $root->as_HTML; # useful to see how HTML::TreeBuilder 
# understands your HTML. For example it will wrap the implied 
# dl element around dt, which you need to take into account 
# when writing the XPath query below 

my $id= "a1"; 
# you need the .//dt because of the extra dl 
my @divs= $root->findnodes(qq{//div[.//dt[\@id="$id"]]}); 

print $divs[0]->as_HTML; # or as_text 
+0

धन्यवाद मिरोड, xpath का उपयोग करके ऐसा लगता है कि यह वास्तव में मेरी आरएडी की मदद करेगा :) टिप्पणियां वास्तव में सहायक भी थीं, यह जानकर कि यह मेरे एचटीएमएल को कैसे समझता है, यह बहुत महत्वपूर्ण है। – Codygman

संबंधित मुद्दे

 संबंधित मुद्दे