Parses XML para devolver los horarios del bus en la parada de autobús especificada -- python campo con beginner campo con xml campo con beautifulsoup campo con curl camp codereview Relacionados El problema

Parses XML to return the bus times at specified bus stop


3
vote

problema

Español

El código utiliza el XML basado en XML OC Transpo Data Feed para crear una lista del autobús Nombre, donde se dirige, y los tiempos. Tenga en cuenta que soy un principiante en Python, por lo que se aprecia cualquier consejo.

  import subprocess, pprint from bs4 import BeautifulSoup   def format_set(result_set):     new_set = []     for el in result_set:         new_set.append(str(el.get_text()))     return new_set    def get_stop_number():     print('Please enter your desired stop number (or 'quit'):')     stop_numb = raw_input('> ')     try:         return int(stop_numb)     except:         print('Exiting...')         return 'quit'   def get_stop_info(stopNo):     try:         output = subprocess.check_output(('curl -d "appID=ba91e757&apiKey=…'             '&stopNo={}&format=xml" https://api.octranspo1.com/v1.2/GetNextTripsForStopAllRoutes').format(stopNo), shell=True)         soup = BeautifulSoup(output, 'xml')     except:         print('An error occured!')         return None     summary = []     for el in soup.find_all('Route'):         routeNo = int(el.find('RouteNo').get_text())          routeHeading = str(el.find('RouteHeading').get_text())         times = format_set(el.find_all('TripStartTime'))         x = [routeNo, routeHeading, times]         summary.append(x)     return summary   def is_empty(any_structure):     if any_structure:         return False     else:         return True   if __name__ == '__main__':     while True:         stop_number = get_stop_number()         if stop_number == 'quit':             break         summary = get_stop_info(stop_number)         pprint.pprint(summary)   

Salida de muestra:

  Please enter your desired stop number (or 'quit'): > 3058   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                  Dload  Upload   Total   Spent    Left  Speed 100  7756  100  7679  100    77   4654     46  0:00:01  0:00:01 --:--:--  4656 [[92, 'St-Laurent', ['11:30', '12:00', '12:30']],  [92, 'Stittsville', []],  [96, 'St-Laurent', ['10:51', '11:21', '11:51']],  [96, 'Terry Fox', ['10:09', '10:39', '11:09']],  [118, 'Hurdman', ['11:20', '11:40', '12:00']],  [118, 'Kanata', []],  [162, 'Stittsville', ['11:55', '12:55', '13:55']],  [162, 'Terry Fox', []],  [168, 'Bridlewood', ['11:35', '12:05', '12:35']],  [168, 'Terry Fox', []]] Please enter your desired stop number (or 'quit'): > quit Exiting... 1  
Original en ingles

The code uses the XML-based OC Transpo data feed to create a list of the bus name, where it's headed, and the times. Keep in mind that I am a beginner at python so any advice at all is appreciated.

import subprocess, pprint from bs4 import BeautifulSoup   def format_set(result_set):     new_set = []     for el in result_set:         new_set.append(str(el.get_text()))     return new_set    def get_stop_number():     print('Please enter your desired stop number (or \'quit\'):')     stop_numb = raw_input('> ')     try:         return int(stop_numb)     except:         print('Exiting...')         return 'quit'   def get_stop_info(stopNo):     try:         output = subprocess.check_output(('curl -d "appID=ba91e757&apiKey=xe2x80xa6'             '&stopNo={}&format=xml" https://api.octranspo1.com/v1.2/GetNextTripsForStopAllRoutes').format(stopNo), shell=True)         soup = BeautifulSoup(output, 'xml')     except:         print('An error occured!')         return None     summary = []     for el in soup.find_all('Route'):         routeNo = int(el.find('RouteNo').get_text())          routeHeading = str(el.find('RouteHeading').get_text())         times = format_set(el.find_all('TripStartTime'))         x = [routeNo, routeHeading, times]         summary.append(x)     return summary   def is_empty(any_structure):     if any_structure:         return False     else:         return True   if __name__ == '__main__':     while True:         stop_number = get_stop_number()         if stop_number == 'quit':             break         summary = get_stop_info(stop_number)         pprint.pprint(summary) 

Sample output:

Please enter your desired stop number (or 'quit'): > 3058   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                  Dload  Upload   Total   Spent    Left  Speed 100  7756  100  7679  100    77   4654     46  0:00:01  0:00:01 --:--:--  4656 [[92, 'St-Laurent', ['11:30', '12:00', '12:30']],  [92, 'Stittsville', []],  [96, 'St-Laurent', ['10:51', '11:21', '11:51']],  [96, 'Terry Fox', ['10:09', '10:39', '11:09']],  [118, 'Hurdman', ['11:20', '11:40', '12:00']],  [118, 'Kanata', []],  [162, 'Stittsville', ['11:55', '12:55', '13:55']],  [162, 'Terry Fox', []],  [168, 'Bridlewood', ['11:35', '12:05', '12:35']],  [168, 'Terry Fox', []]] Please enter your desired stop number (or 'quit'): > quit Exiting... 
              

Lista de respuestas

1
 
vote
  • Las importaciones están bien, encontrará diferentes consejos sobre si importar Funciones individuales, así que no diré más.
  • TIENE volatile6 , bueno, tal vez simplemente mueva el bloque contenido en otra función volatile7 para que pueda invocarlo fácilmente desde el Rewn.
  • volatile8 es obsoleto, en algún momento solo recordarás eso vacío Las listas son volatile9 en un contexto booleano. Ah, y no está sin usar.
  • Tienes muchas opciones de cotización en Python, así que si necesitas un literal synchronized0 En una cadena, considere la delimitarla con synchronized1 en lugar de usar el Sintaxis backslash.
  • estás en Python, así que tal vez también use la biblioteca HTTP incorporada en lugar de bombardear a synchronized2 .
  • synchronized3 se escribe más fácilmente con una lista de la lista, por ejemplo:

      synchronized4  
  • Técnicamente synchronized5 acepta más que solo números y synchronized6 , así que sé consciente de eso. Yo enline el synchronized7 Además de la variable (n.b. ¿Por qué preocuparse por ahorrar dos caracteres allí?)

      synchronized8  
  • synchronized9 tiene una variable de camello, que es inconsistente con El resto y en general no se les aconseja en Python. De nuevo, el bucle puede ser una lista de la lista, pero tal vez sea un poco demasiado denso, su elección. En general, devolviendo una lista no estructurada, también lo será. evitar que el lector obtenga una comprensión más clara del código, pero si es solo para fines de visualización, está bien.

      maintenanceUserCred0  
  • Soy un fanático de factorización agresiva del código común, puedes intentarlo y Mira cómo te gusta E.G. creando funciones más pequeñas para maintenanceUserCred1 y así sucesivamente; que puede ser útil más tarde en el (los) programa (s) de su (s) programa (s).

 
  • Imports are okay, you'll find different advice about whether to import individual functions, so I'll say no more.
  • You have __name__ ..., good, perhaps just move the contained block into another function main so that you can easily invoke it from the REPL.
  • is_empty is obsolete, at some point you'll just remember that empty lists are False in a boolean context. Oh and it's unused as well.
  • You have a lot of quoting options in Python, so if you need a literal ' in a string, consider delimiting it with " instead of using the backslash syntax.
  • You're in Python, so perhaps also use the built-in HTTP library instead of shelling out to curl.
  • format_set is more easily written with a list comprehension, e.g.:

    def format_set(result_set):     return [str(el.get_text()) for el in result_set] 
  • Technically get_stop_number accepts more than just numbers and 'quit', so just be aware of that. I'd inline the stop_numb variable as well (n.b. why care about saving two characters there?)

    ... return int(raw_input('> ')) 
  • get_stop_info has a camel-case variable s, that's inconsistent with the rest and in general not advised in Python. Again, the loop can be a list comprehension, but maybe that'll be a bit too dense, your choice. In general returning an unstructured list like is will also prevent the reader from getting a clearer understanding of the code, but if it's just for display purposes that's fine.

    ... return [[int(el.find('RouteNo').get_text()),          str(el.find('RouteHeading').get_text()),          format_set(el.find_all('TripStartTime'))]         for el in soup.find_all('Route')] 
  • I'm a fan of aggressively factoring out common code, you can try and see how you like e.g. creating smaller functions for int(el.find(name).get_text()) and so on; that can be helpful later on as your program(s) grow(s).

 
 

Relacionados problema

3  Sistema de votación de Laravel  ( Laravel voting system ) 
He escrito una clase de votación en Laravel. Utiliza los sitios de votación API para verificar si el usuario ha votado hoy. Solo se permite que un usuario vot...

4  Tirar los datos de la API, permitió la memoria agotada  ( Pulling data from api allowed memory exhausted ) 
Estoy trabajando en un proyecto donde tire los datos (JSON) de una API. Me gustaría manipular estos datos y almacenar esto como información útil en mi DB (MyS...

13  Manejo de muchas excepciones de redes en Ruby  ( Handling many networking exceptions in ruby ) 
¿Cuál sería una forma más bonita / más rápida de hacer el manejo de múltiples errores en Ruby? Aquí está el código con el que estoy trabajando: begin res...

2  Biblioteca cliente basada en rizos (Ronda 2)  ( Curl based rest client library round 2 ) 
Esta es una segunda iteración en una revisión anterior: Biblioteca de clientes de REST basada en rizo He hecho algunas refactorizaciones para dividir la r...

10  HTTP STROP PART 2 Un flujo que abre un HTTP GET y luego actúa como un istempor normal de C ++  ( Http stream part 2 a stream that opens an http get and then acts like a normal c ) 
La revisión que pedí ayer fue solo para una biblioteca de encabezado. Stream que abre una obtención HTTP y luego actúa como un ISTREAM NORMAL C ++ Esto t...

13  Enviando un mensaje SMS en C  ( Sending an sms message in c ) 
Recientemente he estado jugando con la idea de enviar un mensaje de texto usando C. Mirando algunas opciones, pensé que usando libcurl para enviar un correo...

3  Biblioteca de clientes basados ​​en curl  ( Curl based rest client library ) 
Recientemente he refactorado una biblioteca de clientes de descanso y esperaba obtener una revisión tanto para la clase como las pruebas de la unidad que lo c...

3  Biblioteca de clientes de reposo basado en rizos (Ronda 3)  ( Curl based rest client library round 3 ) 
Esta solicitud de revisión de código se relaciona con esta revisión del código que cubre el caso básico de uso de llamadas de un solo descanso en esta bibli...

1  Llamando a los servicios web de descanso de manera eficiente  ( Calling restful web services efficiently ) 
Necesito usar este código para buscar datos del servicio web y mostrarlos en un sitio correctamente, pero después de solicitar el servicio web, no puedo carga...

3  Optimización de la secuencia de comandos PHP que obtiene la búsqueda de páginas HTML enteras  ( Optimizing php script fetching entire html pages ) 
El siguiente script debe obtener enlaces que se almacenan en un archivo de texto (línea por línea), luego colóquelos en una matriz y finalmente escanee el cód...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos