Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Άντληση Δεδομένων από το Internet.

Άντληση Δεδομένων από το Internet. 13 Χρόνια 2 Μήνες πριν #1248

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Πολλές φορές βλέπουμε κάποια στοιχεία - δεδομένα σε μια ιστοσελίδα και θέλουμε να τα χρησιμοποιήσουμε σε κάποια εργασία μας με άλλη μορφή π.χ. κείμενο.

Για να πάρουμε τα συγκεκριμένα δεδομένα χρειαζόμαστε τα modules re και urllib καθώς και να χειριστούμε - να καθαρίσουμε κάποια αλφαριθμητικά.

Στο συγκεκριμένο παράδειγμα παίρνει τα στοιχεία των ΔΟΥ της Ελλάδας από τον ιστότοπο της ΓΓΠΣ.

Ο κώδικας είναι σε Python 3.

EDIT
def remove_chrs(s):
    '''
        Strips white space and new line characters
        from the string.
 
        @author: Konstas Marmatakis
        License: GNU/GPL v3.0
 
        Returns String
 
    '''
    splited = s.split()
    nkey = ''
    try:
        for i in splited:
            nkey = nkey + ' ' + i.strip()
    except IndexError:
        nkey = splited[0].strip()
    return nkey
 
 
def listdoy():
    '''
        Takes the kodes form Tax Offices in the
        http://www.gsis.gr web site
 
        @author: Konstas Marmatakis
        License: GNU/GPL v3.0
 
        Returns dictionary
 
    '''
    import re
    import urllib.request
 
    # The pattern
    ptrn = r'<div.*>(\d+)</div>.*\s*.*<div.*>([\s*\w+\.?.*\'?\s*]+).*</div>'
 
    # Read the website
    f = urllib.request.urlopen('http://www.gsis.gr/ggps/doy/kodikoi_doy.html')
    periexomeno = str(f.read().decode('iso-8859-7'))
 
    # Special for the kodikoi_doy.html we remove the <span> tag 
    periexomeno1 = periexomeno.replace(r"<span style='mso-spacerun:yes'>", '')
    periexomeno2 = periexomeno1.replace('</span>', '')
 
    # We extract kodes and Tax offices
    # doy is a tuple
    doy = re.findall(ptrn, periexomeno2)
 
 
    doy_key = {}
 
    for num, txt in doy:
        doy_key[num] = remove_chrs(txt)
 
    return doy_key
 
if __name__ == '__main__':
    x = listdoy()
    for k in sorted(x.keys()):
        print(k + " " + x[k])
Γράφω σε Python 3
Τελευταία διόρθωση: 13 Χρόνια 2 Μήνες πριν από kamar. Αιτία: Διευκρίνηση στον κώδικα
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": pmav99

Απ: Άντληση Δεδομένων από το Internet. 13 Χρόνια 2 Μήνες πριν #1254

  • bold
  • Το Άβαταρ του/της bold
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
ωραιος! εψαχνα κατι τετοιο
μπορεις να εξήγησής το:
# The pattern
    ptrn = r'<div.*>(\d+)</div>.*\s*.*<div.*>([\s*\w+\.?.*\'?\s*]+).*</div>'
ή κάποιο link που να εξηγεί...
Τελευταία διόρθωση: 13 Χρόνια 2 Μήνες πριν από bold.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Άντληση Δεδομένων από το Internet. 13 Χρόνια 2 Μήνες πριν #1255

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
bold έγραψε:
ωραιος! εψαχνα κατι τετοιο
μπορεις να εξήγησής το:
# The pattern
    ptrn = r'<div.*>(\d+)(\d+).*\s*.*<div.*>([\s*\w+\.?.*\'?\s*]+).*</div>'
ή κάποιο link που να εξηγεί...

EDIT
Σε γενικές γραμμές:
  • Όταν θέλουμε να εξάγουμε κάποια στοιχεία από μια σελίδα προσπαθούμε να δούμε τι συνδυασμός επαναλαμβάνεται για να μπορέσουμε να «απομονώσουμε τα δεδομένα μας. Στο συγκεκριμένο site διαπίστωσα ότι ο πίνακας των στοιχείων είναι ανάμεσα σε <div> tags.
  • "<div.*>": Ψάχνουμε για το κυριολεκτικό <div ακολουθούμενο από κανένα ή περισσότερους οποισδήποτε χαρακτήρες και τελειώνει σε κυριολέκτικό >.
  • "(\d+)": Εδώ γρουπάρουμε ή απομονώνουμε ένα ή περισσότερα ψηφία. Συγκεκριμένα οι κωδικοί ΔΟΥ είναι τετραψήφιοι.
  • "</div>": Πάλι ψάχνουμε το συγκεκριμένο κυριολεκτικό...
  • ".*\s*.*": Που συνεχίζει με μηδέν ή περισσότερους χαρακτήρες, μηδέν ή περισσότερους κενούς χαρακτήρες και συνέχεια με μηδέν ή περισσότερους χαρακτήρες.
  • "([\s*\w+\.?.*\'?\s*]+)": Γκρουπάρουμε "()" τουλάχιστον ένα ή περισσότερα "+", από τα σύμβολα που βρίσκονται στις αγκύλες "[]", που τουλάχιστιον ένα είναι γράμμα της αλφαβήτου.

Αναλυτικά εδώ και εδώ.
Οι κανονικές παραστάσεις (Regular Expressions) είναι ένα δύσκολο κομμάτι, αλλά όταν το μάθεις, θα σου λύσει τα χέρια για τέτοιες δουλειές.
Εγώ ακόμη μαθαίνω.:P
Γράφω σε Python 3
Τελευταία διόρθωση: 13 Χρόνια 2 Μήνες πριν από kamar.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": bold

Απ: Άντληση Δεδομένων από το Internet. 13 Χρόνια 2 Μήνες πριν #1261

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Για τις regex μπορείτε να κοιτάξετε ΑΥΤΟ και αν θέλετε κάτι σε python ΑΥΤΟ

edit
@ kamar
Ο παραπάνω κώδικας είναι για python 3 σωστά? Αν θέλεις διευκρίνισε το στο αρχικό post.
Τελευταία διόρθωση: 13 Χρόνια 2 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": kamar

Απ: Άντληση Δεδομένων από το Internet. 13 Χρόνια 2 Μήνες πριν #1263

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Για τις regex μπορείτε να κοιτάξετε ΑΥΤΟ και αν θέλετε κάτι σε python ΑΥΤΟ

Επίσης αυτό που υπάρχει στα παραδείγματα της Python.

Συνημμένο αρχείο:

Όνομα Αρχείου: redemo.zip
Μέγεθος αρχείου:2 KB
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.377 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου