我试图从这个网页(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个表。
关于另一种方法的任何想法?
答案 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,您需要做的是:
找到包含信息的刺痛
使用BeautifulSoup将字符串转换为BS对象
从BS对象中提取数据
<强>代码:强>
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'))