美丽的汤到csv

时间:2015-08-25 21:39:43

标签: python html csv beautifulsoup

有一些关于将美丽的汤数据提供给csv文件的线程,但我找不到一个对我的代码有意义的。

我正在从WSJ最大的赢家中攫取。在一天之内,3到103给了我排名前100位的股票。

我在单独的单元格上获取表格中每行的每个值时遇到问题。每行应该有6个单元格和数据。然后它应该转到下一行并给我接下来的6个数据点(下一个库存)。

每当我使用下面的方法时,它只会在WSJ股票上输出一行而不是多次循环并且每次都转到下一行。我不确定这样做是为了让前6个标签位于第1行,然后接下来的6个标签位于第2行。

我尝试使用修改symbol.text制作名为cells的列表但没有运气。

将第一行中的所有值设置为第一行更容易,因为其中有六个但是它们需要位于自己的单元格中。我试过循环这个也没有运气。

我是Python的新手,所以最简单的代码是最好的。

import requests
from bs4 import BeautifulSoup
import csv

urlList = ['http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer.html',
       'http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer--20150806.html?mod=mdc_pastcalendar',
       'http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer--20150805.html?mod=mdc_pastcalendar',
       'http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer--20150804.html?mod=mdc_pastcalendar',
       'http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer--20150803.html?mod=mdc_pastcalendar']



for i in range(len(urlList)):
    url = urlList[i]            
    r = requests.get(url)
    soup = BeautifulSoup(r.content)         
    scrapeData = soup.select('tr')[3:103]    
    for symbol in scrapeData: 
       print(symbol.text)  



outputFile = open('wsjExample.csv', 'w')          
outputWriter = csv.writer(outputFile)
outputWriter.writerow(['Number', 'Symbol', 'Price', 'Change', '% Change', 'Volume'])
for row in range(len(scrapeData)):
    outputWriter.writerow([symbol('td')[0].text, symbol('td')[1].text, symbol('td')[2].text, symbol('td')[3].text, symbol('td')[4].text, symbol('td')[5].text])
outputFile.close()

谢谢,

3 个答案:

答案 0 :(得分:0)

问题是你在迭代数据的循环之外引用symbol('td')。你基本上是这样做的:

scrapeData=[...] # list of the scraped data

for symbol in scrapeData:
    print symbol

# symbol is now set to the last item in scrapeData
# open file etc..
# for row in scrapeData length - do this next action that many times:
print symbol('td')[0] # this will print the first element in the symbol, which is the last element in scrapeData - there is no connection to the row at all.

您需要做的是将第一个循环中的值刮过scrapeData - 将其放入临时列表中。然后在写入CSV文件时迭代列表。

答案 1 :(得分:0)

正如我在comment above中所述, String s1 = "taco cat"; boolean palindrome = true; s1 = s1.replaceAll("\\s", ""); char[] arr = s1.toCharArray(); for (int i = 0; i < arr.length / 2; ++i) { if (arr[i] != arr[(arr.length - 1) - i]) { palindrome = false; break; } } System.out.println("Is palindrome: " + palindrome); 可以访问给定网址下提供的表格。需要忽略表的第一行,因为这是标题并且不包含正确的数据(一些'智能'实现提取标题作为列名称会很好,但我没有实现这样的东西)这是由.find('table', {'class' : 'mdcTable'})中的[1:]完成。

要分离数据提取和csv导出,我将所有提取的数据存储到字典for row in table.findAll('tr')[1:]中,该字典附加到名为d的列表中。所有提取的值都以适当的方式格式化,以包含整数,浮点数和字符串,以及删除不需要的换行符或逗号。

收集完所有数据,存储在dicts中并附加到data列表后,使用DictWriter和相应的.writeheader()和{{3将整个列表写入csv文件方法:

data

答案 2 :(得分:0)

这是如何用csv文件写的:

{{1}}