我正在开发一个从APOD网站获取图片并显示其信息的程序(网站中称为解释的部分,就在图片下方)。我将展示一个简化的类,它只实现选择图片信息的部分:
import urllib2
import datetime
from BeautifulSoup import BeautifulSoup
from gi.repository import Gtk
class InfoAPOD(Gtk.Window):
"""View info about selected APOD image"""
def __init__(self):
"""Initialize the window"""
Gtk.Window.__init__(self)
self.set_default_size(600, 500)
self.set_position(Gtk.WindowPosition.CENTER)
self.set_border_width(3)
self.grid = Gtk.Grid()
self.add(self.grid)
self.scrolledwindow = Gtk.ScrolledWindow()
self.scrolledwindow.set_vexpand(True)
self.scrolledwindow.set_hexpand(True)
self.grid.add(self.scrolledwindow)
self.label = Gtk.Label()
self.scrolledwindow.add_with_viewport(self.label)
date = datetime.date.today()
page = "ap" + date.strftime('%y%m%d') + ".html"
base_url = "http://apod.nasa.gov/apod/"
apod_url = base_url + page
apod_htm = urllib2.urlopen(apod_url).read()
soup = BeautifulSoup(apod_htm)
tag_b = soup.findAll('b')
tag_p = soup.findAll('p')
apod_dat = date.strftime('%Y %h %d')
apod_tit = tag_b[0].string.strip()
apod_inf = str(tag_p[2])
name = "APOD from " + apod_dat + " - " + apod_tit
self.set_title(name)
text = apod_inf.replace('<p>', '').replace('</p>', '')
self.label.set_markup(text)
self.label.set_justify(Gtk.Justification.LEFT)
self.label.set_line_wrap(True)
def main():
"""Show the window"""
win = InfoAPOD()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
Gtk.main()
return 0
if __name__ == '__main__':
main()
问题是文本行被打断了,并且没有形成一个连续的段落(如果你看看APOD网站你就会明白我的意思)。或许一张图胜过千言万语:
简而言之,我使用urllib2来获取网页,并使用BeautifulSoup来解析标签,如上面的代码所示。然后,我分离出我想要的部分信息(类型为BeautifulSoup.Tag)并将其转换为字符串,以便使用标记将其设置为标签。我在这里和那里阅读了一些关于BeautifulSoup的文档/示例,但我无法改善文本的外观。
任何有关如何改善窗口中文本外观的建议都值得赞赏。