将终端文本输出格式化为表格

0 投票
2 回答
524 浏览
提问于 2025-04-17 20:34

我已经成功使用BeautifulSoup从一个网址提取了一个表格。现在我想把输出格式化成一个表格,这样我就可以在GeekTool中使用它。

from bs4 import BeautifulSoup
import urllib2
wiki = "https://www.google.com/maps/place?q=type:transit_station:%22145+St%22&ftid=0x89c2f67c67a250f9:0x92d51daa07480dd1"
header = {'User-Agent': 'Mozilla/5.0'} #Needed to prevent 403 error on Wikipedia
req = urllib2.Request(wiki,headers=header)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page)

desination = ""
eta = ""
table = soup.find("table", { "class" : "pprtjt" })


for row in table.findAll("tr"):
    for cell in row.findAll("td"):
       print cell.findAll(text=True)

这段代码输出了以下内容:

[u'   C to 168 St  ']
[u'2 min']
[u'   D to Norwood - 205 St  ']
[u'4 min']
[u'   A to Ozone Park - Lefferts Blvd  ']
[u'4 min']
[u'   A to Inwood - 207 St  ']
[u'5 min']
[u'   D to Coney Island - Stillwell Av  ']
[u'10 min']
[u'   C to 168 St  ']
[u'15 min']
[u'   D to Norwood - 205 St  ']
[u'19 min']
[u'   A to Far Rockaway - Mott Av  ']
[u'19 min']
[u'   A to Inwood - 207 St  ']
[u'20 min']

所以,第一行是第一列的第一行,第二行是第二列的第一行,依此类推,比如:

C to 168 St                 | 2 min
D to Norwood - 205 St       | 4 min
A to Ozone Park - Lefferts Blvd | 4 min
A to Inwood - 207 St        | 5 min
D to Coney Island - Stillwell Av    | 10 min
C to 168 St                 | 15 min
D to Norwood - 205 St       | 19 min
A to Far Rockaway - Mott Av         | 19 min
A to Inwood - 207 St        | 20 min

理想情况下,我希望它能以表格的形式打印出来,然后把整个内容放到GeekTool中。我的代码基础来自这里:http://adesquared.wordpress.com/2013/06/16/using-python-beautifulsoup-to-scrape-a-wikipedia-table/,所以提到了维基百科。

我对这个完全是个新手,如果这完全是错误的做法,我很抱歉。提前谢谢大家。

2 个回答

0

可以看看termsql,这是一个专门为这种需求设计的工具,虽然我不太确定我完全理解你的输出内容,你可能需要再简化一下。

使用手册:http://tobimensch.github.io/termsql/

项目地址:https://github.com/tobimensch/termsql

你可能会对--line-as-column这个选项感兴趣。

0

我觉得你最后的双重循环应该像这样:

for row in table.findAll("tr"):
    rowText = []
    for cell in row.findAll("td"):
        # Append every cell in this row
        rowText.append(cell.findAll(text=True)[0])
    # print the row joining the cells with '|'
    print ' | '.join(rowText)

撰写回答