Начинающий Python: читать элементы в одном файле и использовать их для изменения другого файла - PullRequest
0 голосов
/ 18 мая 2011

Я экономист без опыта программирования.Я пытаюсь научиться использовать 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()

Код читает таблицу, берет только необходимую информацию и создает текстовый файл.Код довольно прост, но он выполняет свою работу.

Моя проблема начинается сейчас.URL, который я разместил выше, является лишь одним из примерно 200, из которых мне нужно проанализировать данные.Все URL-адреса различаются только по двум элементам.Используя предыдущий URL:

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

, два элемента, которые однозначно идентифицируют эту страницу: MILANO (название города) и 15146 (бюрократический код).

Я хотел сначала создать файл с двумя столбцами:

  1. Во первых названия городов, которые мне нужны;
  2. Во вторых бюрократические коды.

Затем я хотел создать в python цикл, который будет читать каждую строку этого файла, корректно изменять URL в моем коде и выполнять задачу синтаксического анализа отдельно для каждого города.

Есть ли у вас какие-либо предложения о том, как поступить?Заранее благодарен за любую помощь и предложение!

[Обновление]

Спасибо всем за полезные предложения.Я нашел ответ Томаса К наиболее простым для реализации моих знаний по питону.У меня все еще есть проблемы.Я изменил код следующим образом:

#!/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 ]

1 голос
/ 18 мая 2011

Одна маленькая вещь, которую нужно исправить:

Это:

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

Должно быть так:

for city in citylist:
    outfile = open("%s.txt" % city, "w")
#                           ^^^^^^
0 голосов
/ 18 мая 2011

Просто выцарапываю основы ...

#!/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()
0 голосов
/ 18 мая 2011

Нет необходимости создавать отдельный файл, используйте словарь python, в котором есть связь: city-> code.

См .: http://docs.python.org/tutorial/datastructures.html#dictionaries

0 голосов
/ 18 мая 2011

Быстро и грязно:

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

Есть более мощные инструменты, такие как urllib.urlencode(), как упоминал Игнасио.Но они, вероятно, излишни для этого.

PS Поздравляю: вы сделали трудную задачу - извлекли данные из HTML.Цикл по списку - легкий бит.

0 голосов
/ 18 мая 2011

Если файл в формате CSV, вы можете использовать csv для его чтения.Затем просто используйте urllib.urlencode() для генерации строки запроса и urlparse.urlunparse() для генерации полного URL.

...