3 votes

Tcl regexp parties de cette chaîne de caractères

[ 22.06.2013 23:23:41 UTC ]--[&nbsp;&nbsp;&nbsp;PRE&nbsp;&nbsp;&nbsp;]--[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="?section=0DAY" title="SHOW ONLY 0DAY">0DAY</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]--[ <a href="?search=Aminsamples+Sexy+Melody+Vol+2+MIDI+6581">Aminsamples.Sexy.Melody.Vol.2.MIDI-6581</a> ]--<b>[ 2.30MB ]</b>--<b>[ 1F ]</b>--<span style="font-weight: bold;">[ <a href="download/Aminsamples.Sexy.Melody.Vol.2.MIDI-6581.rar" title="Aminsamples.Sexy.Melody.Vol.2.MIDI-6581.rar">DOWNLOAD</a> ]

Je veux récupérer les données qui s'affichent comme ceci.

[ 22.06.2013 23:23:41 UTC ]--[   PRE   ]--[      0DAY       ]--[ Aminsamples.Sexy.Melody.Vol.2.MIDI-6581 ]--[ 2.30MB ]--[ 1F ]--[ DOWNLOAD ]

mais je ne sais pas trop comment faire, tout ce que j'arrive à récupérer est Aminsamples.Sexy.Melody.Vol.2.MIDI-6581.rar

Je voudrais faire cela dans TCL

Voici ce que j'ai actuellement.

   catch {set http [::http::geturl http://www.prelist.ws -timeout 15000]} error
     if {[string match "*error*" $error]} { puts "connect error!" ; return 0 }
      if {[string match "*timeout*" $error]} { puts "timeout!"; return 0 }
       set html [::http::data [split $http "\n"]]
         regsub -all "&amp;" $html {\&} html
         regsub -all "&times;" $html {*} html
         regsub -all "&nbsp;" $html { } html
         regsub -all -nocase "&#215;" $html "x" html
         regsub -all -nocase "&lt;" $html "<" html
         regsub -all -nocase "&gt;" $html ">" html
         regsub -all ">" $html "" html
            regsub -all "<tt" $html "" html
    foreach line $html {
    if {[string match "*SHOW*" $line]} { continue }
    if {[string match "*title*" $line]} {
    regexp -nocase -- {title="(.*?)>} $line -> all line
    regsub -all -nocase "title=" $line {} line
    regsub -all -nocase "DOWNLOAD" $line {} line
    regsub -all -nocase "\"</a" $line {} line
    regsub -all -nocase "\"free" $line {} line
    regsub -all -nocase "\"" $line {} line
    regsub -all -nocase "\\\[" $line {} line
    regsub -all -nocase "<title" $line {} line
    regsub -all -nocase "\\\]</title" $line {} line
    puts "$line"
}
}

2voto

Casimir et Hippolyte Points 33449

Cela peut facilement être fait avec xpath :

#! /usr/bin/tclsh

package require tdom

set fp [open "input.txt" r]
set html [read $fp]
close $fp

set doc [ dom parse -html $html ] 
set root [$doc documentElement]
set itemNodes [$doc selectNodes {//div[@id="list"]/tt/small}]

foreach itemNode $itemNodes {
    puts "[$itemNode asText]"
}

Notez que vous pouvez diviser chaque champ avec ce modèle :

foreach itemNode $itemNodes {
    set line "[string trim [$itemNode asText] \[\]\ ]"
    set fields [regexp -inline -all -- {[^[\s][^][]*?\S(?=\s*(?:]|$))} $line]
    puts [lindex $fields 2]
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X