Python爬网表元素

时间:2016-12-26 20:27:43

标签: python beautifulsoup

我试图从这个网页(http://www.basketball-reference.com/teams/CHO/2017.html)中提取对应于表格(Team Misc)的所有元素。

我想从" Team"中提取所有数字。 - (这一行: 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频谱中心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个表。

关于另一种方法的任何想法?

3 个答案:

答案 0 :(得分: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个表。

答案 1 :(得分:0)

我想你想要

tables = bsObja.findAll("table")

答案 2 :(得分:0)

BS中Comment对象中的数据和Comment对象只是一种特殊类型的NavigableString,您需要做的是:

  1. 找到包含信息的刺痛

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

  3. 从BS对象中提取数据

  4. <强>代码:

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

    这将返回包含表格html代码的sting。

    table = BeautifulSoup(table_string, 'lxml')
    

    使用sting构造BS对象,并从对象中提取数据

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

    <强>输出:

    ['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'
    

    基于此,我们可以使用纯BS而不是re来提取评论

    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'))