我正在尝试从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])
代码似乎通常运作良好。但是我有以下问题:
以下是输出示例:
([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'])
任何帮助将不胜感激。谢谢
答案 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保留我们的所有权利,包括但不限于 任何和所有版权,商标,专利,商业秘密和任何 我们可能在我们的网站上拥有的其他所有权 内容,以及可能提供的商品和服务。指某东西的用途 我们的权利和财产需要我们事先书面同意。我们不是 通过制作向您提供任何默示或明示的许可或权利 您可以获得的服务,您无权制作任何服务 我们的网站或服务的商业用途,未经我们事先书面许可 同意。
无法看到此网页的内容,因为它们并非如此 查看或复制。
任何违规者都将受到法律的全面起诉并可能面临 民事和刑事指控以及巨额罚款。你被警告了! 小心!
他们认为“无法看到此网页的内容”有点愚蠢,因为很明显,他们可以(如果不可能,您的网络浏览器无法显示)。但他们已经不遗余力地让它变得更难,所以在未经同意的情况下使用他们的数据可能是他们可以起诉的。
这是否违法取决于你像往常一样向律师支付多少钱。