我是一名没有编程背景的经济学家。我正在尝试学习如何使用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(官僚代码)。
我想要做的是,首先,创建一个包含两列的文件:
然后,我想在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'
再次感谢!
答案 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()