Zählen von Zeichen aus einer HTML-Datei mit Python

Oct 13 2020

Ich habe gerade Level 2 der Python Challenge auf pythonchallenge.com abgeschlossen und bin gerade dabei, Python zu lernen. Bitte nehmen Sie mich und alle dummen Fehler, die ich möglicherweise gemacht habe, mit.

Ich suche nach Feedback, was ich in meinem Code hätte besser machen können. Zwei Bereiche speziell:

  • Wie hätte ich den Kommentarbereich der HTML-Datei leichter identifizieren können? Ich habe eine Beat-around-the-Bush-Methode verwendet, die das Ende des Kommentars gefunden hat (oder den Anfang technisch, aber er zählt vom Ende) und mir einige zusätzliche Zeichen gegeben, die ich erkennen und vorwegnehmen konnte (das Extra) "->" und "-"). Welche Bedingung hätte diesen Kommentar besser gefunden, damit ich ihn in eine neue Zeichenfolge einfügen könnte, die gezählt werden soll?

Folgendes habe ich geschrieben:

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)

Und das ist der Quell-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:
-->

<!--

Gefolgt von Tausenden von Zeichen und der Kommentar endet mit '->'

Antworten

2 fartgeek Oct 13 2020 at 20:36

Ich habe nicht genug Ruf, um einen Kommentar abzugeben, daher muss ich dies in einer Antwort sagen. Es sieht klobig aus

    while x == 4:

und dann tun

    x = 3

wann immer Sie aus der Schleife ausbrechen möchten. Es sieht besser aus

    while True:

und wenn Sie aus der Schleife ausbrechen wollen, tun Sie

    break

Prost!

1 AJNeufeld Oct 14 2020 at 05:51

Redundanter Code

pagetext = ""
pagetext = (page.text)

In der ersten Zeile wird eine leere Zeichenfolge zugewiesen pagetext. Die zweite Zeile ignoriert den bereits vorhandenen Inhalt pagetextund weist der Variablen einen anderen Wert zu.

Warum sich mit der ersten Aussage beschäftigen? Es macht den Code einfach länger, langsamer und schwerer zu verstehen.

Warum sich mit der (...)Umgebung beschäftigen page.text? Sie dienen auch keinem Zweck.

Variablennamen

Variablen wie isind ein zweischneidiges Schwert. Sie verwenden es als Schleifenindex und verwenden es dann, um auf einen gefundenen Ort zu verweisen, nachdem die Schleife beendet wurde. Aber ian sich hat es nicht viel Bedeutung. posnkönnte klarer sein. last_comment_posnwäre viel klarer, wenn auch sehr ausführlich.

PEP-8 empfiehlt die Verwendung von Unterstrichen, um Wörter in Variablennamen zu trennen: dh char_countnicht verwenden charcountusw.

Suche nach einer Zeichenfolge

Python-Strings verfügen über integrierte Funktionen zum Suchen nach einem Teilstring in einem größeren String. Zum Beispiel str.findkönnte schnell das erste Vorkommen <!--im Seitentext gefunden werden.

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

Aber du suchst nicht nach dem ersten; du suchst den letzten. Python hat Sie wieder mit der Reverse-Find-Funktion behandelt : str.rfind.

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

Dies findet aber immer noch den Index des letzten Auftretens. Sie möchten die Zeichen nach der Kommentarmarkierung, daher müssen wir 4 zusätzliche Zeichen überspringen:

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

Verbesserter 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)