Contando caracteres de un archivo HTML con Python -- python campo con beginner campo con python-3.x campo con parsing camp codereview Relacionados El problema

Counting Characters from an HTML File with Python


4
vote

problema

Español

Acabo de completar el nivel 2 del desafío de Python en PythonChallenge.com y estoy en el proceso de aprender Python, por favor, tenga en cuenta conmigo y cualquier error tonto que pueda haber hecho.

Estoy buscando algunos comentarios sobre lo que podría haber hecho mejor en mi código. Dos áreas específicamente:

  • ¿Cómo podría haber identificado más fácilmente la sección de comentarios del archivo HTML? Utilicé un método de latido alrededor del arbusto de ese tipo de finalización del final del comentario (o el principio técnicamente, pero está contando desde el final) y me dio algunos personajes adicionales que pude reconocer y anticipar (el extra "- & gt;" y "-"). ¿Qué condiciones habría encontrado mejor este comentario para poder ponerlo en una nueva cadena para ser contada?

Esto es lo que escribí:

  from collections import Counter import requests  page = requests.get('http://www.pythonchallenge.com/pc/def/ocr.html')  pagetext = "" pagetext = (page.text) #find out what number we are going back to  i = 1 x = 4 testchar = "" testcharstring = ""   while x == 4:     testcharstring = pagetext[-i:]     testchar = testcharstring[0]     if testchar == "-":         testcharstring = pagetext[-(i+1)]         testchar = testcharstring[0]         if testchar == "-":             testcharstring = pagetext[-(i+2)]             testchar = testcharstring[0]             if testchar == "!":                 testcharstring = pagetext[-(i+3)]                 testchar = testcharstring[0]                 if testchar == "<":                     x = 3             else:                 i += 1                 x = 4         else:             i += 1             x = 4     else:         i += 1 print(i)  newstring = pagetext[-i:]  charcount = Counter(newstring)  print(charcount)   

y esta es la fuente html:

  <html> <head>   <title>ocr</title>   <link rel="stylesheet" type="text/css" href="../style.css"> </head> <body> <center><img src="ocr.jpg"> <br><font color="#c03000"> recognize the characters. maybe they are in the book, <br>but MAYBE they  are in the page source.</center>  <br> <br> <br>  <font size="-1" color="gold"> General tips: <li>Use the hints. They are helpful, most of the times.</li> <li>Investigate the data given to you.</li> <li>Avoid looking for spoilers.</li> <br> Forums: <a href="http://www.pythonchallenge.com/forums"/>Python Challenge Forums</a>,  read before you post. <br> IRC: irc.freenode.net #pythonchallenge <br><br> To see the solutions to the previous level, replace pc with pcc, i.e. go  to: http://www.pythonchallenge.com/pcc/def/ocr.html  </body> </html>  <!-- find rare characters in the mess below: -->  <!--   

seguido de miles de personajes y el comentario concluye con '- & gt;'

Original en ingles

I just completed level 2 of The Python Challenge on pythonchallenge.com and I am in the process of learning python so please bear with me and any silly mistakes I may have made.

I am looking for some feedback about what I could have done better in my code. Two areas specifically:

  • How could I have more easily identified the comment section of the HTML file? I used a beat-around-the-bush method that kind of found the end of the comment (or the beginning technically but it is counting from the end) and gave me some extra characters that I was able to recognize and anticipated (the extra "-->" and "-"). What condition would have better found this comment so I could put it in a new string to be counted?

This is what I wrote:

from collections import Counter import requests  page = requests.get('http://www.pythonchallenge.com/pc/def/ocr.html')  pagetext = "" pagetext = (page.text) #find out what number we are going back to  i = 1 x = 4 testchar = "" testcharstring = ""   while x == 4:     testcharstring = pagetext[-i:]     testchar = testcharstring[0]     if testchar == "-":         testcharstring = pagetext[-(i+1)]         testchar = testcharstring[0]         if testchar == "-":             testcharstring = pagetext[-(i+2)]             testchar = testcharstring[0]             if testchar == "!":                 testcharstring = pagetext[-(i+3)]                 testchar = testcharstring[0]                 if testchar == "<":                     x = 3             else:                 i += 1                 x = 4         else:             i += 1             x = 4     else:         i += 1 print(i)  newstring = pagetext[-i:]  charcount = Counter(newstring)  print(charcount) 

And this is the source HTML:

<html> <head>   <title>ocr</title>   <link rel="stylesheet" type="text/css" href="../style.css"> </head> <body> <center><img src="ocr.jpg"> <br><font color="#c03000"> recognize the characters. maybe they are in the book, <br>but MAYBE they  are in the page source.</center>  <br> <br> <br>  <font size="-1" color="gold"> General tips: <li>Use the hints. They are helpful, most of the times.</li> <li>Investigate the data given to you.</li> <li>Avoid looking for spoilers.</li> <br> Forums: <a href="http://www.pythonchallenge.com/forums"/>Python Challenge Forums</a>,  read before you post. <br> IRC: irc.freenode.net #pythonchallenge <br><br> To see the solutions to the previous level, replace pc with pcc, i.e. go  to: http://www.pythonchallenge.com/pcc/def/ocr.html  </body> </html>  <!-- find rare characters in the mess below: -->  <!-- 

Followed by thousands of characters and the comment concludes with '-->'

           
 
 

Lista de respuestas

2
 
vote

No tengo suficiente reputación para comentar, así que debo decir esto en una respuesta. Se ve clunky de usar

                  self_type operator++() 8  

y luego hacer

                  self_type operator++() 9  

siempre que desee salir del bucle. Se ve mejor para hacer

                  self_type operator++(int) 0  

y cuando quiere salir del bucle do

                  self_type operator++(int) 1  

vítores!

 

I donxe2x80x99t have enough reputation to comment, so I must say this in an answer. It looks clunky to use

    while x == 4: 

and then do

    x = 3 

whenever you want to break out of the loop. It looks better to do

    while True: 

and when you want to break out of the loop do

    break 

Cheers!

 
 
   
   
1
 
vote

Código redundante

  pagetext = "" pagetext = (page.text)   

La primera línea asigna una cadena vacía a pagetext . La segunda línea ignora los contenidos ya en pagetext y asigna un valor diferente a la variable.

¿Por qué molestarse con la primera declaración? Simplemente hace que el código sea más largo, más lento y más difícil de entender.

¿Por qué molestarse con el (...) alrededor de page.text ? Tampoco están sirviendo ningún propósito.

Nombres de variables

Variables como i son una espada de doble filo. Lo está usando como un índice de bucle, y luego lo está utilizando para hacer referencia a una ubicación encontrada después de que el bucle termina. Pero i por sí mismo no tiene mucho sentido. posn podría ser más claro. last_comment_posn sería mucho más claro, aunque muy verbosa.

PEP-8 recomienda usar los guiones bajos para separar las palabras en nombres de variables: es decir, use char_count NO pagetext0 etc.

Buscando una cadena de caracteres

Las cadenas de Python tienen funciones incorporadas para buscar una subcadena en una cadena más grande. Por ejemplo, pagetext1 podría Encuentre rápidamente la primera aparición de pagetext2 en el texto de la página.

  pagetext3  

pero no estás buscando el primero; Estás buscando el último. Python otra vez lo ha cubierto, con la función de búsqueda inversa: pagetext4 .

  pagetext5  

Pero esto todavía encuentra el índice de la última ocurrencia. Desea los caracteres después del marcador de comentarios, por lo que necesitamos omitir 4 caracteres adicionales:

  pagetext6  

Código mejorado

  pagetext7  
 

Redundant Code

pagetext = "" pagetext = (page.text) 

The first line assigns an empty string to pagetext. The second line ignores the contents already in pagetext and assigns a different value to the variable.

Why bother with the first statement? It simply makes the code longer, slower, and harder to understand.

Why bother with the (...) around page.text? They also are not serving any purpose.

Variable Names

Variables like i are a double-edged sword. You're using it as a loop index, and then you're using it to reference a found location after the loop terminates. But i by itself doesn't have much meaning. posn might be clearer. last_comment_posn would be much clearer, though very verbose.

PEP-8 recommends using underscores to separate words in variable names: ie, use char_count not charcount etc.

Searching for a string of characters

Python strings have built-in functions for searching for a substring in a larger string. For instance, str.find could rapidly find the first occurrence of <!-- in the page text.

i = pagetext.find("<!--") 

But you're not looking for the first one; you're looking for the last one. Python again has you covered, with the reverse find function: str.rfind.

i = pagetext.rfind("<!--") 

But this still finds the index of the last occurrence. You want the characters after the comment marker, so we need to skip forward 4 additional characters:

if i >= 0:     newstring = pagetext[i+4:] 

Improved code

import requests from collections import Counter  page = requests.get('http://www.pythonchallenge.com/pc/def/ocr.html') page.raise_for_status()  # Crash if the request didn't succeed page_text = page.text  posn = page_text.rfind("<!--") print(posn)  if posn >= 0:     comment_text = page_text[posn+4:]    # Fix!  This is to end of string, not end of comment!     char_count = Counter(comment_text)     print(char_count) 
 
 

Relacionados problema

6  Programa de Convertidor de Infix a Postfix  ( Infix to postfix converter program ) 
Esta es mi tarea. Amablemente ayúdame a verificarlo? Las instrucciones son: Implementar una expresión de infIX en el convertidor de expresión postfix. De...

7  Analizador de cadena citado  ( Quoted string parser ) 
He escrito un analizador de cadena que está diseñado para dividir una cadena por espacios, excluyendo espacios envueltos en cuerdas. Aquí hay algunas entrad...

8  Hola, Java World ~> analizando una cuadrícula de sudoku  ( Hello java world parsing a sudoku grid ) 
Este es mi primer intento, muy, muy, por primera vez en Java . No he empezado a abordar la resolución real de la sudoku Puzzle (ni siquiera estoy seguro de...

7  Parser para fórmulas CNF  ( Parser for cnf formulas ) 
Tengo un analizador para las fórmulas CNF en Formato DIMACS , que es muy lento. ¿Alguna sugerencia sobre cómo mejorar su velocidad? Hice algún perfil y podrí...

8  Dividir datos de diccionarios de texto lisos a múltiples archivos  ( Splitting plain text dictionary data to multiple files ) 
Tengo un archivo de texto simple con el contenido de un diccionario ( Diccionario no arabidgigado de Webster ) en este formato: A A (named a in the Englis...

4  Clase de análisis y manejo de URI  ( Uri parsing and handling class ) 
Escribí una clase simple para lidiar con el análisis y manejar URIS para el proyecto en el que estoy trabajando actualmente, ya que se basa mucho en esa funci...

2  libconfini (biblioteca compartida)  ( Libconfini shared library ) 
Recientemente escribí una pequeña biblioteca de análisis INI. El código también está en GitHub , con documentación . Me gustaría tener opiniones, sugerencia...

6  Otro analizador de JSON y serializador para QT, pero con características adicionales  ( Yet another json parser and serializer for qt but with additional features ) 
Escribí QJson , una clase de utilidad en / para qt, necesito que eche un vistazo. Tanto es un analizador y serializador JSON, sino con una funcionalidad exte...

4  Posibles peligros de desbordamiento de búfer en el programa de análisis de registro C  ( Possible buffer overflow dangers in c log parsing program ) 
Después de horas de trabajo, finalmente terminé mi primer programa de análisis de registro C! (Anteriormente fue un guión bash, ahora es C). ¡Aunque creo qu...

6  Usando GetOpt analizar y validar los argumentos de la línea de comandos  ( Using getopt parse and validate command line arguments ) 
Estoy aprendiendo getopt en Python para analizar y validar las entradas de la línea de comandos: #!/usr/bin/python ''' Mailing Script Usage: python scrip...




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