python中的简单forvalues循环?

时间:2016-02-12 22:23:50

标签: python loops web screen-scraping

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'")
      ....
      }

非常感谢! 最大

4 个答案:

答案 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)

希望这有帮助。