【问题标题】:Simple forvalues loop in python?python中的简单forvalues循环?
【发布时间】:2016-05-24 05:31:51
【问题描述】:

在 Python 中有没有一种简单的方法来循环一个简单的数字列表? 我想从仅 3 个数字不同的不同 URL 中抓取一些数据?

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

非常感谢! 最大

【问题讨论】:

  • 在范围内尝试,类似于 for x in range(0, 9): print(x)

标签: python loops web screen-scraping


【解决方案1】:

我已将您的原始代码分解为函数,只是为了更清楚地说明我认为您的问题的答案:使用简单的循环,并使用 .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)

【讨论】:

    【解决方案2】:

    我会为此使用 set.intersection():

    mylist=[1,16,8,32,7,5]
    fieldmatch=[5,7,16]
    
    intersection = list(set(mylist).intersection(fieldmatch))
    

    【讨论】:

      【解决方案3】:

      我不熟悉stata,但是。看起来python等价物可能很简单:

      import request 
      for i in [13 34 55 67]:
               response =  request("http://www.example.com/{}".format(i))
                ....
      

      【讨论】:

        【解决方案4】:

        最简单的方法是在循环中应用过滤器:

        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)
        

        希望这会有所帮助。

        【讨论】:

        • 好的,谢谢。但是我看不到我是如何遍历每个数字的整个代码的。抱歉这个“简单”的问题。
        猜你喜欢
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 2014-10-18
        • 1970-01-01
        • 2015-12-30
        • 2016-12-15
        相关资源
        最近更新 更多