Python初学者:在一个文件中读取元素并使用它们来修改另一个文件

时间:2011-05-17 22:55:19

标签: python loops iteration writing

我是一名没有编程背景的经济学家。我正在尝试学习如何使用python,因为我被告知它非常强大,可以解析网站上的数据。目前,我坚持使用以下代码,我将非常感谢任何建议。

首先,我编写了一个代码来解析此表中的数据:

http://www.webifel.it/sifl/Tavola07.asp?comune=MILANO&cod_istat=15146

我写的代码如下:

#!/usr/bin/env python

from mechanize import Browser
from BeautifulSoup import BeautifulSoup
import urllib2, os

def extract(soup):
table = soup.find("table", cellspacing=2)
for row in table.findAll('tr')[2:]:
        col = row.findAll('td')
        year = col[0].div.b.font.string
        detrazione = col[1].div.b.font.string
        ordinaria = col[2].div.b.font.string
        principale = col[3].div.b.font.string
        scopo = col[4].div.b.font.string
        record = (year, detrazione, ordinaria, principale, scopo)
        print >> outfile, "|".join(record)



outfile = open("milano.txt", "w")
br = Browser()
br.set_handle_robots(False)
url = "http://www.webifel.it/sifl/Tavola07.asp?comune=MILANO&cod_istat=15146"
page1 = br.open(url)
html1 = page1.read()
soup1 = BeautifulSoup(html1)
extract(soup1)
outfile.close()

代码读取表格,只获取我需要的信息并创建一个txt文件。代码非常简陋,但它完成了这项工作。

我的问题现在就开始了。我上面发布的网址只是我需要解析数据的大约200个中的一个。 所有网址仅由两个元素区分。使用上一个网址:

http://www.webifel.it/sifl/Tavola07.asp?comune=MILANO&cod_istat=15146

唯一标识此页面的两个元素是MILANO(城市名称)和15146(官僚代码)。

我想要做的是,首先,创建一个包含两列的文件:

  1. 首先是我需要的城市名称;
  2. 在第二个官僚代码中。
  3. 然后,我想在python中创建一个循环来读取该文件的每一行,正确修改我的代码中的url并分别为每个城市执行解析任务。

    您对如何进行有任何建议吗? 提前感谢您的任何帮助和建议!

    [更新]

    感谢大家的有益建议。我发现Thomas K的答案对我的python知识来说最容易实现。不过我还是有问题。 我用以下方式修改了代码:

    #!/usr/bin/env python
    
    from mechanize import Browser
    from BeautifulSoup import BeautifulSoup
    import urllib2, os
    import csv
    
    def extract(soup):
    table = soup.find("table", cellspacing=2)
    for row in table.findAll('tr')[2:]:
            col = row.findAll('td')
            year = col[0].div.b.font.string
            detrazione = col[1].div.b.font.string
            ordinaria = col[2].div.b.font.string
            principale = col[3].div.b.font.string
            scopo = col[4].div.b.font.string
            record = (year, detrazione, ordinaria, principale, scopo)
            print >> outfile, "|".join(record)
    
    citylist = csv.reader(open("citycodes.csv", "rU"), dialect = csv.excel)
    for city in citylist:
    outfile = open("%s.txt", "w") % city
    br = Browser()
    br.set_handle_robots(False)
    url = "http://www.webifel.it/sifl/Tavola07.asp?comune=%s&cod_istat=%s" % city
    page1 = br.open(url)
    html1 = page1.read()
    soup1 = BeautifulSoup(html1)
    extract(soup1)
    outfile.close()
    

    其中citycodes.csv采用以下格式

    MILANO;12345
    MODENA;67891
    

    我收到以下错误:

    Traceback (most recent call last):
    File "modena2.py", line 25, in <module>
     outfile = open("%s.txt", "w") % city
    TypeError: unsupported operand type(s) for %: 'file' and 'list'
    

    再次感谢!

5 个答案:

答案 0 :(得分:1)

你需要解决一件小事:

此:

for city in citylist:
    outfile = open("%s.txt", "w") % city
#                                 ^^^^^^

应该是这样的:

for city in citylist:
    outfile = open("%s.txt" % city, "w")
#                           ^^^^^^

答案 1 :(得分:0)

如果文件是CSV格式,则可以使用csv进行阅读。然后只需使用urllib.urlencode()生成查询字符串,然后使用urlparse.urlunparse()生成完整的网址。

答案 2 :(得分:0)

无需创建单独的文件,而是使用python字典代替其中存在关系:city-&gt; code。

请参阅:http://docs.python.org/tutorial/datastructures.html#dictionaries

答案 3 :(得分:0)

又快又脏:

import csv
citylist = csv.reader(open("citylist.csv"))
for city in citylist:
    url = "http://www.webifel.it/sifl/Tavola07.asp?comune=%s&cod_istat=%s" % city
    # open the page and extract the information

假设你有一个csv文件:

MILANO,15146
ROMA,12345

有更强大的工具,如Ignacio提到的urllib.urlencode()。但他们可能有点过头了。

P.S。恭喜:你已经完成了很难 - 从HTML中抓取数据。在列表上循环很容易。

答案 4 :(得分:0)

只是略读基础......

#!/usr/bin/env python

from mechanize import Browser
from BeautifulSoup import BeautifulSoup
import urllib2, os

outfile = open("milano.txt", "w")

def extract(soup):
    global outfile
    table = soup.find("table", cellspacing=2)
    for row in table.findAll('tr')[2:]:
            col = row.findAll('td')
            year = col[0].div.b.font.string
            detrazione = col[1].div.b.font.string
            ordinaria = col[2].div.b.font.string
            principale = col[3].div.b.font.string
            scopo = col[4].div.b.font.string
            record = (year, detrazione, ordinaria, principale, scopo)
            print >> outfile, "|".join(record)



br = Browser()
br.set_handle_robots(False)

# fill in your cities here anyway like
ListOfCityCodePairs = [('MILANO', 15146)]

for (city, code) in ListOfCityCodePairs:
    url = "http://www.webifel.it/sifl/Tavola07.asp?comune=%s&cod_istat=d" % (city, code)
    page1 = br.open(url)
    html1 = page1.read()
    soup1 = BeautifulSoup(html1)
    extract(soup1)

outfile.close()