1

我正在开发一个从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网站你就会明白我的意思)。或许一张图胜过千言万语:

APOD 图片信息

简而言之,我使用urllib2来获取网页,并使用BeautifulSoup来解析标签,如上面的代码所示。然后,我分离出我想要的部分信息(类型为BeautifulSoup.Tag)并将其转换为字符串,以便使用标记将其设置为标签。我在这里和那里阅读了一些关于BeautifulSoup的文档/示例,但我无法改善文本的外观。

任何有关如何改善窗口中文本外观的建议都值得赞赏。

4

1 回答 1

2

是否要删除换行符?关于什么?

text = apod_inf.replace('<p>', '').replace('</p>', '').replace('\n', '')

如果您不想那么混乱,您可以尝试以下方法:

foo.replace('\n\n', 'SOMETOKEN').replace('\n', 'SOMETOKEN', 1).replace('\n', '', 1).replace('SOMETOKEN', '\n')
于 2013-04-28T14:20:22.483 回答