Menghitung Karakter dari File HTML dengan Python

Oct 13 2020

Saya baru saja menyelesaikan The Python Challenge level 2 di pythonchallenge.com dan saya sedang dalam proses belajar python jadi mohon bersabar dan kesalahan konyol yang mungkin saya buat.

Saya mencari beberapa umpan balik tentang apa yang bisa saya lakukan dengan lebih baik dalam kode saya. Dua bidang khusus:

  • Bagaimana saya bisa lebih mudah mengidentifikasi bagian komentar pada file HTML? Saya menggunakan metode bertele-tele yang menemukan akhir komentar (atau permulaan secara teknis tetapi menghitung dari akhir) dan memberi saya beberapa karakter tambahan yang dapat saya kenali dan antisipasi (ekstra "->" dan "-"). Kondisi apa yang lebih baik untuk menemukan komentar ini sehingga saya dapat memasukkannya ke dalam string baru untuk dihitung?

Ini yang saya tulis:

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)

Dan ini HTML sumbernya:

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

<!--

Diikuti oleh ribuan karakter dan komentar diakhiri dengan '->'

Jawaban

2 fartgeek Oct 13 2020 at 20:36

Saya tidak memiliki reputasi yang cukup untuk berkomentar, jadi saya harus mengatakan ini dalam sebuah jawaban. Tampaknya kikuk untuk digunakan

    while x == 4:

dan kemudian lakukan

    x = 3

kapan pun Anda ingin keluar dari lingkaran. Ini terlihat lebih baik untuk dilakukan

    while True:

dan ketika Anda ingin keluar dari lingkaran lakukan

    break

Bersulang!

1 AJNeufeld Oct 14 2020 at 05:51

Kode Redundan

pagetext = ""
pagetext = (page.text)

Baris pertama memberikan string kosong ke pagetext. Baris kedua mengabaikan konten yang sudah ada pagetextdan memberikan nilai yang berbeda ke variabel.

Mengapa repot-repot dengan pernyataan pertama? Itu hanya membuat kode lebih panjang, lebih lambat, dan lebih sulit untuk dipahami.

Mengapa repot-repot dengan (...)sekitar page.text? Mereka juga tidak melayani tujuan apa pun.

Nama Variabel

Variabel seperti iadalah pedang bermata dua. Anda menggunakannya sebagai indeks loop, dan kemudian Anda menggunakannya untuk mereferensikan lokasi yang ditemukan setelah loop berakhir. Tapi idengan sendirinya tidak banyak artinya. posnmungkin lebih jelas. last_comment_posnakan jauh lebih jelas, meski sangat bertele-tele.

PEP-8 merekomendasikan penggunaan garis bawah untuk memisahkan kata-kata dalam nama variabel: yaitu, char_countjangan gunakan, charcountdll.

Mencari serangkaian karakter

String Python memiliki fungsi built-in untuk mencari substring dalam string yang lebih besar. Misalnya, str.finddapat dengan cepat menemukan kemunculan pertama <!--di teks halaman.

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

Tapi Anda tidak mencari yang pertama; Anda sedang mencari yang terakhir. Python lagi telah Anda tertutup, dengan fungsi find sebaliknya: str.rfind.

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

Tapi ini masih menemukan indeks kejadian terakhir. Anda menginginkan karakter setelah penanda komentar, jadi kita perlu melewati 4 karakter tambahan:

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

Kode yang ditingkatkan

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)