0
votes

Comment extraire un texte spécifique d'une page Web

Je suis intéressé à trouver des modèles de constellations. J'utilise l'application Android "Sky Map" pour inspection visuelle, je souhaite maintenant créer une application pour trouver des structures de constellation similaires. Un sous-problème de cela consiste à trouver les coordonnées pour des objets célestes spécifiques.

Exemple: Comment puis-je obtenir les coordonnées de "lune" à un temps, une date et un emplacement donné. P>

https://theskylive.com/planétarium fournit ces informations sur leur page Web de la manière suivante. P>

 Object: Moon [info|live][less]
 Right Asc: 04h 15m 12.5s **Decl: 17° 05' 46.3"** (J2000) [HMS|Dec]
 Magnitude: -10.54 Altitude: 56° Solar Elongation: 100.4° Constellation: Ari 
 Sun distance: 147.77 Million Km Earth distance: 0.38 Million Km
 Rise: 10:48 Transit: 18:40 Set: 01:35 **Europe/London**


5 commentaires

Prévoyez-vous d'extraire ces données dans l'application Android sur une étape de préparation sur le PC?


Ouais je veux extraire ces données dans une application Android. Y a-t-il quelque chose qui ne va pas dans ma question, il a 2 bowvotes.


Je ne connais pas les bowvotes, désolé. Peut-être que les lecteurs pensent qu'il n'y a pas assez de détails dans la publication sur la mise en œuvre planifiée.


Quels détails je vais ajouter? Je ferai à coup sûr.


Je ne suis pas un programmeur mobile, mais peut-être des détails sur les versions du système d'exploitation pris en charge, les cadres que vous envisagez d'utiliser seraient utiles?


4 Réponses :


1
votes

Je ne suis pas sûr que cela soit utile, mais voici une implémentation python. Vous devriez comprendre les paramètres de localisation acceptés, mais la date, l'heure et la minute sont toutes là-bas: xxx

sortie: Xxx


0 commentaires

0
votes

ci-dessous, vous pouvez trouver le code sur la façon de faire cela dans Python. Il existe de nombreuses façons d'intégrer le code dans une application. Juste pour l'illustration, j'ai lancé les résultats dans un Dataframe Pandas afin que vous puissiez voir les résultats. J'ai également ajouté du code pour traiter les paramètres de proxy, si ce n'est pas le cas, vous pouvez le laisser et simplement obtenir le texte de l'URL avec le package des demandes.

espère que cela aide. P>

import urllib
import pandas as pd
import numpy as np

username = 'userID'  # ex. ID
password = "password!"  # password

dataURL = "https://theskylive.com/moon-info"

proxies = {
    'https':  'https://{}:{}@proxy:port'.format(username, password)}
proxy = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)

with urllib.request.urlopen(dataURL) as url:
    text = str(url.read())

tableStart = text.find('The Moon Ephemeris')
tableEnd = text.find('Distance of The Moon from Earth')
tableProgress = tableStart

findSTR = 'moon&date='
loc = text.find(findSTR,tableStart,tableEnd)
startDate = text[loc+len(findSTR):loc+len(findSTR)+10] 

table = []
tableRow = []
counter = 0
counter2 = 0

diff = [20,4]

while loc>0:

    loc1 = text.find('<td class="desktop">',tableProgress,tableEnd)
    loc2 = text.find('<td>',tableProgress,tableEnd)

    if loc1<0:
        if loc2<0:
            loc = -1
        else:
            loc = loc2
            pos = 1
    else:
        if loc2<0:
            loc = loc1
            pos = 0
        else:            
            loc = np.min([loc1,loc2])
            pos = np.argmin([loc1,loc2])


    if loc>0:



        locStart = loc+diff[pos]
        loc = text.find('</td>',loc,tableEnd)

        if loc>0:
            extractedText = text[locStart:loc]

            if counter ==1:

                extractedText = extractedText.replace('&deg;',' deg')
                extractedText = extractedText.replace('&rsquo;',' min')
                extractedText = extractedText.replace('&rdquo;',' sec')
            elif counter ==3:                
                extractedText = extractedText.replace('&rdquo;',' arcsec')
            tableRow = tableRow+ [extractedText]
            tableProgress = loc


            counter = counter+1
            if counter==5:
                counter2 = counter2+1                
                counter = 0
                table = table+[tableRow]
                tableRow = []


idx = pd.date_range(start='2019-02-26', periods=len(table), freq='D')
cols = ['Right Ascension','Declination','Magnitude','Apparent Diameter','Constellation']

Data = pd.DataFrame(table,index=idx,columns=cols)
print(Data)


0 commentaires

2
votes

Je ne suis pas un expert Android, mais c'est ce que vous pouvez faire dans

build.Gradle xxx

planétarium .java xxx

sortie: xxx


2 commentaires

Fyi, les anciennes classes de date-heure terriblement gênantes telles que java.util.date , java.util.calendar et java.text.simpledeformat sont maintenant Legacy , supplanté par le java.time cours de classe intégrée à Java 8 et plus tard. Voir Tutoriel par Oracle .


Corrigez @basilbourque ... Cela était juste censé être un exemple rapide et sale pour montrer comment obtenir les données :)



0
votes

Vous pouvez simplement configurer votre propre serveur de raclage de données, vous pouvez utiliser IFTTT pour obtenir les données et le stocker au début.

Voici quelques belles tutoriels: https://public.tablope.com/en-us/s/blog/2013/08/DATA-SCRAPING-PART-IFTTTTTTTT

Je suis sûr que vous ne voulez pas que votre application fasse la gratte. Une fois que vous l'avez enregistré, vous pouvez le manipuler davantage avec une langue et la fournir par ex. Format JSON en tant que DataSource macérable pour votre application.


0 commentaires