Python中有一种简单的方法可以循环遍历一个简单的数字列表吗? 我想从不同的网址中抓取一些只有3个数字不同的数据?
我对python很陌生,无法想出一个简单的方法。 非常感谢! 这是我的代码:
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.example.com/3322")
bsObj = BeautifulSoup(html)
table = bsObj.findAll("table",{"class":"MainContent"})[0]
rows=table.findAll("td")
csvFile = open("/Users/Max/Desktop/file1.csv", 'wt')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow=[]
for cell in row.findAll(['tr', 'td']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
finally:
csvFile.close()
在Stata中,这就像:
foreach i of 13 34 55 67{
html = urlopen("http://www.example.com/`i'")
....
}
非常感谢! 最大
答案 0 :(得分:2)
我已经将原始代码分解为函数,只是为了让我更清楚我认为是你问题的答案:使用一个简单的循环,.format()
来构建url和文件名。
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
def scrape_url(url):
html = urlopen(url)
bsObj = BeautifulSoup(html)
table = bsObj.findAll("table",{"class":"MainContent"})[0]
rows=table.findAll("td")
return rows
def write_csv_data(path, rows):
csvFile = open(path, 'wt')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow=[]
for cell in row.findAll(['tr', 'td']):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
finally:
csvFile.close()
for i in (13, 34, 55, 67):
url = "http://www.example.com:3322/{}".format(i)
csv_path = "/Users/MaximilianMandl/Desktop/file-{}.csv".format(i)
rows = scrape_url(url)
write_csv_data(csv_path, rows)
答案 1 :(得分:1)
我会使用set.intersection():
mylist=[1,16,8,32,7,5]
fieldmatch=[5,7,16]
intersection = list(set(mylist).intersection(fieldmatch))
答案 2 :(得分:1)
我不熟悉stata,但是。看起来python等价物可能只是:
import request
for i in [13 34 55 67]:
response = request("http://www.example.com/{}".format(i))
....
答案 3 :(得分:0)
最简单的方法是在循环中应用过滤器:
mylist=[1,16,8,32,7,5]
for myitem in mylist:
if myitem in (5,7,16):
print myitem # or print(myitem)
然而,这可能不是最优雅的方式。如果要存储匹配结果的新列表,可以使用列表推导:
mylist=[1,16,8,32,7,5]
fieldmatch=[5,7,16]
filteredlist=[ x for x in mylist if x in fieldmatch ]
然后,您可以filteredlist
只包含mylist
中与fieldmatch
匹配的项目(换句话说,您的原始列表按您的条件进行过滤),并像其他任何列表一样迭代它:
for myitem in filteredlist:
# Perform whatever process you want to each item here
do_something_with(myitem)
希望这有帮助。