Python ile HTML Dosyasından Karakterleri Sayma
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
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!
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)