使用BeautifulSoup将数据从数据框中删除

时间:2017-12-08 05:14:36

标签: python python-2.7 web-scraping beautifulsoup html-parsing

我正在开展一个项目,将加利福尼亚州彩票中的数据汇总并解析为dataframe

到目前为止,这是我的代码,它不会产生错误也没有输出:

import requests
from bs4 import BeautifulSoup as bs4

draw = 'http://www.calottery.com/play/draw-games/superlotto-plus/winning-numbers/?page=1'
page = requests.get(draw) 
soup = bs4(page.text)

drawing_list = []

for table_row in soup.select("table.tag_even_numbers tr"):
    cells = table_row.findAll('td')

    if len(cells) > 0:
        draw_date = cells[0].text.strip()
        numbers = cells[1].text.strip()
        mega = cells[2].text.strip()

        drawings = {'dates': draw_date, 'winning_numbers': numbers, 'mega_number': mega}
        drawing_list.append(drawings)
        print "added {0} {1} {2}, to the list".format(draw_date, numbers, mega)

预期输出:我希望将表格行划分为dataframe

draw_date  | numbers        | mega
-----------|----------------|-----
12/06/2017 | 12 24 07 01 02 | 23
12/02/2017 | 33 18 07 42 40 | 7

感谢您在正确的方向上进行任何修改或协助。

1 个答案:

答案 0 :(得分:1)

此表达式"table.tag_even_numbers tr"不选择任何内容,因为该表没有'tag_even_numbers'类,但有一个'tag_even'类和'numbers'类。

所以如果你改变了这个:

soup.select("table.tag_even_numbers tr")  

到:

soup.select("table.tag_even.numbers tr")

drawing_list你应该有20件物品。

同样通过.text选择numbers,您可以将所有数字并排加入字符串中。
如果你想要一个数字列表,你应该使用.stripped_strings,例如:

numbers = list(cells[1].stripped_strings)

然后您可以从drawing_list创建数据框,例如:

df = pd.DataFrame(drawing_list)
print(df.head())
                 dates mega_number       winning_numbers
0   Dec 6, 2017 - 3201          23  [12, 24, 07, 01, 02]
1   Dec 2, 2017 - 3200           7  [33, 18, 07, 42, 40]
2  Nov 29, 2017 - 3199           6  [03, 33, 26, 27, 07]
3  Nov 25, 2017 - 3198          19  [21, 46, 13, 25, 17]
4  Nov 22, 2017 - 3197           3  [32, 40, 27, 42, 08]