2016-12-26 71 views
1

我想从此网页(http://www.basketball-reference.com/teams/CHO/2017.html)中提取与表(Team Misc)对应的所有元素。Python抓取表元素

我想从“团队”中提取所有数字 - (此行: 17 13 2.17 -0.51 1.66 106.9 104.7 96.5 .300 .319 .493 10.9 20.5 .228 .501 11.6 79.6 .148 Spectrum Center 269 ,47)

import urllib2 
from bs4 import BeautifulSoup 

htmla = urllib2.urlopen('http://www.basketball-reference.com/teams/CHO/2017.html') 
bsObja=BeautifulSoup(htmla,"html.parser") 
tables = bsObja.find_all("table") 

试过上面的代码,希望能得到所有表的列表,然后选择正确的。但现在事情我怎么尝试,我只从这个页面得到1个表。

任何想法的另一种方法?

+0

请将该图片直接包含在您的问题中,而不是随时可能会被破解的链接。 – ettanany

+0

此页面包含HTML中的所有数据,但隐藏为注释并使用JavaScript显示。但是你可以用'BeautifuSoup'来找到这个注释,删除'<! - '和' - >'并用'BeautifuSoup'使用结果来获取数据。我认为这个问题在之前的一些问题中得到了解决。 – furas

回答

2

这个页面有隐藏在评论中所有表和JavaScript使用它来显示表,可能是显示之前排序或筛选。

所有的评论都在<div class='placeholder'>之后,所以你可以用它来找到这个评论,从评论中获取所有文本,并使用BS来解析它。

#!/usr/bin/env python3 

#import urllib.request 
import requests 
from bs4 import BeautifulSoup as BS 

url = 'http://www.basketball-reference.com/teams/CHO/2017.html' 

#html = urllib.request.urlopen(url) 
html = requests.get(url).text 

soup = BS(html, 'html.parser') 

placeholders = soup.find_all('div', {'class': 'placeholder'}) 

total_tables = 0 

for x in placeholders: 
    # get elements after placeholder and join in one string 
    comment = ''.join(x.next_siblings) 

    # parse comment 
    soup_comment = BS(comment, 'html.parser') 

    # search table in comment 
    tables = soup_comment.find_all('table') 

    # ... do something with table ... 

    #print(tables) 

    total_tables += len(tables) 

print('total tables:', total_tables)  

这样我发现11个表格隐藏在评论中。

0

我想你想

tables = bsObja.findAll("table") 
+0

不过,我只有一张桌子:( –

+1

我刚才看了一下页面,这是因为这些表格是由JavaScript加载的,你需要使用Selenium – HenryM

+0

好吧,我会看看它是如何工作的。感谢您的建议。 –

0

在BS的评论对象的数据,以及评论的对象仅仅是一种特殊类型的NavigableString的,你需要做的是:

  1. 查找包含该信息的刺痛

  2. 使用BeautifulSoup转换字符串对象BS

  3. 提取数据从BS对象

代码:

import re 
table_string = soup.find(string=re.compile('div_team_misc')) 

这将返回一个包含表的HTML代码的刺痛。

table = BeautifulSoup(table_string, 'lxml') 

使用的刺痛从对象

for tr in table.find_all('tr', class_=False): 
    s = [td.string for td in tr('td')] 
    print(s) 

出构建BS对象,并提取数据:

['17', '13', '2.17', '-0.51', '1.66', '106.9', '104.7', '96.5', '.300', '.319', '.493', '10.9', '20.5', '.228', '.501', '11.6', '79.6', '.148', 'Spectrum Center', '269,471'] 
['10', '9', '8', '24', '10', '17', '5', '15', '4', '11', '22', '1', '27', '5', '12', '28', '3', '1', None, '15'] 

更多评论:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" 
soup = BeautifulSoup(markup) 
comment = soup.b.string 

Comment对象只是一个特殊类型的NavigableString,BS会从中提取字符串,我们不需要更改或替换任何html。

comment 
# u'Hey, buddy. Want to buy a used parser' 

在此基础上,我们可以用它代替re纯BS提取评论

table_string = soup.find(id="all_team_misc").contents[-2] 

如果你有什么发现所有的表字符串,你可以这样做:

from bs4 import Commnet 
tables = soup.find_all(string=lambda text:isinstance(text,Comment) and str(text).startswith(' \n'))