使用BeautifulSoup进行for循环的麻烦

时间:2014-02-16 15:31:28

标签: python for-loop beautifulsoup text-extraction

我正在尝试从csv表中的http://www.immihelp.com/h1b-sponsoring-companies-database/display-2-2010.html中提取一些列。

from bs4 import  BeautifulSoup
import urllib2
import csv

f = csv.writer(open("H1B_apps.csv", "w"))
f.writerow(["Name", "Jobs", "Positions", "Wage", "City", "State", "Zip"]) # Write column headers as the first line

for x in range (2,5):

    soup = BeautifulSoup(urllib2.urlopen('http://www.immihelp.com/h1b-sponsoring-companies-database/display-'+str(x)+'-2010.html').read())

    table = soup.find('table', cellspacing = '1')

    rows = table.findAll('tr')



    for tr in rows:
        cols = tr.findAll('nobr')
        for data in cols:
            name = cols[0].findAll(text=True)
            jobs = cols[1].findAll(text=True)
            position = cols[2].findAll(text=True)
            wage = cols[3].findAll(text=True)
            city = cols[4].findAll(text=True)
            state = cols[5].findAll(text=True)
            zip = cols[6].findAll(text=True)

            print(name,jobs,position,wage,city,state,zip)
            f.writerow([name,jobs,position,wage,city,state,zip])

代码似乎通常运作良好。但是我有以下问题:

  1. 输出不断重复7次(我的for循环出错了,但无法解决?)
  2. 输出文字来了['u TEXT'] - 我只想要文字位。
  3. 以下是输出示例:

      

    ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER SUPPORT   专家',[u'43139.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER SUPPORT   专家',[u'43139.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER SUPPORT   专家',[u'43139.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER SUPPORT   专家',[u'43139.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'55994.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'67995.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'67995.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'67995.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员',[u'67995.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])   ([u'22ND CENTURY TECHNOLOGIES,INC'],[u'1'],[u'COMPUTER   程序员],[u'67995.0 /年'],[u'SOMERSET'],[u'NJ'],[u'08873'])

    任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:1)

您无需循环浏览data in cols,因为您正在使用[0],[1],[2]直接访问它们。删除for data in cols:行,您将停止执行所有操作7次。

此外,findAll将始终返回一个列表,因此请name = cols[0].findAll(text=True)[0]自行获取每个元素。

但是,有些行有空字段。如果您尝试使用findAll获取空字段,则会返回空列表[],而不是[''],因此您无法使用[0]访问它。

因为获取一个字段,检查它是否为空,并返回结果是一个常见的事情,你做了很多次,一个简单的方法是使用一个简单的辅助函数:

def getcol(cols, index, default=None):
    try:
        return cols[index].findAll(text=True)[0]
    except IndexError:
        return default
然后,您可以在for name = getcol(cols, 0)的for循环中使用

此外,有些行也是空的,所以我们也需要考虑到这一点。

您知道,这些immihelp页面的来源有此版权声明:

  

immihelp.com保留我们的所有权利,包括但不限于   任何和所有版权,商标,专利,商业秘密和任何   我们可能在我们的网站上拥有的其他所有权   内容,以及可能提供的商品和服务。指某东西的用途   我们的权利和财产需要我们事先书面同意。我们不是   通过制作向您提供任何默示或明示的许可或权利   您可以获得的服务,您无权制作任何服务   我们的网站或服务的商业用途,未经我们事先书面许可   同意。

     

无法看到此网页的内容,因为它们并非如此   查看或复制。

     

任何违规者都将受到法律的全面起诉并可能面临   民事和刑事指控以及巨额罚款。你被警告了!   小心!

他们认为“无法看到此网页的内容”有点愚蠢,因为很明显,他们可以(如果不可能,您的网络浏览器无法显示)。但他们已经不遗余力地让它变得更难,所以在未经同意的情况下使用他们的数据可能是他们可以起诉的。

这是否违法取决于你像往常一样向律师支付多少钱。