2013-02-05 161 views
0

值我是新来的Python和我正在写一个webscraper,以查找<td>行的HTML表:检查是否存在

# open CSV with URLS to scrape 
csv_file = csv.reader(open('urls.csv', 'rb'), delimiter=',') 

names = [] 
for data in csv_file: 
    names.append(data[0]) 

for name in names: 
    html = D.get(name); 
    html2 = html 
    param = '<br />'; 
    html2 = html2.replace("<br />", " | ") 
    print name 

    c = csv.writer(open("darkgrey.csv", "a")) 
    for row in xpath.search(html2, '//table/tr[@class="bgdarkgrey"]'): 
     cols = xpath.search(row, '/td') 
     c.writerow([cols[0], cols[1], cols[2], cols[3], cols[4]]) 

它所做的是从4表中获取价值'<td>'

问题是,有些桌子没有cols[2],cols[3]cols[4]

有没有办法,我可以检查这些是否存在?

感谢

+0

有点偏离主题,但是你真的想追加到“darkgrey.csv”吗?如果我在哪里,我会在全局范围内用“w”打开该文件,以防止在您再次测试该脚本时它增长到inf。还请确保关闭它! – RickyA

回答

2

我不完全熟悉xpath,但你应该能够只是检查的cols长度(只要它不是一个真正奇怪的物体,看起来像在其他方面的序列):

if len(cols) >= 5: 
    ... 

另一个常见的python习语是试试看。

try: 
    c.writerow([cols[0], cols[1], cols[2], cols[3], cols[4]]) 
except IndexError: 
    #failed because `cols` isn't long enough. Do something else. 

最后,假定colslist,你总是可以确保它足够长:

cols.extend(['']*5) 

这将垫空字符串你的专栏,让您有至少5列(通常更多)。

+0

辉煌!我跑了第一部分,它似乎工作。我以前没有用过Python,所以它都是一条学习曲线。 – user1970557

0
c.writerow([col[x] for x in range(0,len(col))]) 

也不要忘记关闭“darkgrey.csv”文件!

+1

也许更容易:'col [:5]' - 切片序列是原谅:) – mgilson

+0

哇,经过测试,它的确是真的宽容。今天学到了新东西:) – RickyA

0

这样

c.writerow([cols[0], cols[1], '' if not(cols[2]) else cols[2], '' if not(cols[3]) else cols[3], '' if not(cols[4]) else cols[4]]) 
0

的另一种可能的方法也许你想说cols = xpath.search(row, 'td')cols = xpath.search(row, '/td')? (没有斜线)