Python ile HTML Dosyasından Karakterleri Sayma

Oct 13 2020

Pythonchallenge.com'da The Python Challenge'ın 2. seviyesini yeni tamamladım ve python öğrenme sürecindeyim, bu yüzden lütfen benimle ve yaptığım aptalca hataların üstesinden gelin.

Kodumda neleri daha iyi yapabileceğime dair bazı geri bildirimler arıyorum. Özellikle iki alan:

  • HTML dosyasının yorum bölümünü nasıl daha kolay belirleyebilirim? Yorumun sonunu (ya da teknik olarak başlangıcı ancak sondan itibaren sayıyor) bulan ve bana tanıyabildiğim ve beklediğim bazı ekstra karakterler verdim (ekstra "->" ve "-"). Sayılacak yeni bir dizeye koyabilmem için bu yorumu hangi koşul daha iyi bulurdu?

Yazdıklarım bu:

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)

Ve bu kaynak HTML'dir:

<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:
-->

<!--

Binlerce karakter takip ediyor ve yorum '->' ile bitiyor

Yanıtlar

2 fartgeek Oct 13 2020 at 20:36

Yorum yapacak kadar itibarım yok, bu yüzden bunu bir cevapta söylemeliyim. Kullanması hantal görünüyor

    while x == 4:

ve sonra yap

    x = 3

döngüden ne zaman çıkmak istersen. Yapması daha iyi görünüyor

    while True:

ve döngüden çıkmak istediğinizde

    break

Şerefe!

1 AJNeufeld Oct 14 2020 at 05:51

Yedek Kod

pagetext = ""
pagetext = (page.text)

İlk satır boş bir dizge atar pagetext. İkinci satır, halihazırda bulunan içeriği yok sayar pagetextve değişkene farklı bir değer atar.

Neden ilk ifadeyle uğraşıyorsunuz? Sadece kodu daha uzun, daha yavaş ve anlaşılmasını zorlaştırır.

Neden (...)etrafta dolaşıyorsun page.text? Ayrıca herhangi bir amaca da hizmet etmiyorlar.

Değişken İsimler

Gibi değişkenler iiki ucu keskin kılıçtır. Bunu bir döngü dizini olarak kullanıyorsunuz ve ardından döngü sona erdikten sonra bulunan bir konuma başvurmak için kullanıyorsunuz. Ama ikendi başına pek bir anlamı yok. posndaha net olabilir. last_comment_posnçok ayrıntılı olsa da çok daha net olurdu.

Yani, kullanım: PEP-8 değişken isimleri ayrı kelime çizgi kullanılmasını önermektedir char_countdeğildir charcountvs.

Bir dizi karakter aranıyor

Python dizeleri, daha büyük bir dizede bir alt dizeyi aramak için yerleşik işlevlere sahiptir. Örneğin , sayfa metninde str.findilk geçtiği yeri hızla bulabilir <!--.

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

Ama ilkini aramıyorsun; sonuncuyu arıyorsunuz. Python tekrar ters bulmak fonksiyonu ile, kapalı etti: str.rfind.

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

Ancak bu yine de son oluşumun dizinini bulur. Yorum işaretinden sonraki karakterleri istiyorsunuz, bu nedenle 4 ek karakteri atlamamız gerekiyor:

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

Geliştirilmiş kod

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)