Python 2.7 网页抓取-获取';布拉布拉赫';从<;td foo=blahblah>;文本</td>;使用bs4?
我正试图从ESPN中搜集一些时间表: 我的代码工作正常,只是输出缺少日期信息:Python 2.7 网页抓取-获取';布拉布拉赫';从<;td foo=blahblah>;文本</td>;使用bs4?,python-2.7,python-3.x,web-scraping,beautifulsoup,Python 2.7,Python 3.x,Web Scraping,Beautifulsoup,我正试图从ESPN中搜集一些时间表: 我的代码工作正常,只是输出缺少日期信息: [ "Phoenix PHX", "Utah UTAH", "394 tickets available from $6" ], [], [ "Miami MIA", "Orlando ORL", "1,582 tickets available from $12" ] 经过一些调查,我意识到日期和时间信息被包装在标签中,如下所示: <td data
[
"Phoenix PHX",
"Utah UTAH",
"394 tickets available from $6"
],
[],
[
"Miami MIA",
"Orlando ORL",
"1,582 tickets available from $12"
]
经过一些调查,我意识到日期和时间信息被包装在标签中,如下所示:
<td data-behavior="date_time" data-date="2017-10-07T23:00Z"><a data-dateformat="time1" href="/nba/game?gameId=400978807" name="&lpos=nba:schedule:time"></a></td>
我经常在其他网站上看到这一点,但我从未真正理解他们为什么这样做。如何提取打开标记中的文本以获得输出中的“2017-10-07T23:00Z”attrs属性包含一个属性字典,您可以利用它来获取值,我添加了一个长度检查,因为存在一些空行 是否可以尝试修改for循环,如下所示:
for i in table:
rows = i.find_all('tr')
for row in rows:
cols = row.find_all('td')
date_data = None
if len(cols) > 2:
date_data = cols[2].attrs['data-date']
cols = [col.text.strip() for col in cols]
dat = [col for col in cols if col]
if date_data:
dat.append(date_data)
data.append(dat)
PS:上面的代码段可以优化:-)属性包含一个属性字典,您可以利用它来获取值,我添加了一个长度检查,因为存在一些空行 是否可以尝试修改for循环,如下所示:
for i in table:
rows = i.find_all('tr')
for row in rows:
cols = row.find_all('td')
date_data = None
if len(cols) > 2:
date_data = cols[2].attrs['data-date']
cols = [col.text.strip() for col in cols]
dat = [col for col in cols if col]
if date_data:
dat.append(date_data)
data.append(dat)
PS:上面的代码片段可以优化:-)该表中的一些
td
标记包含。您可以通过调用attrs()
访问td
的属性,该属性返回:
该表中的一些
td
标记包含。您可以通过调用attrs()
访问td
的属性,该属性返回:
>>> td = soup.select('tr')[1].select('td')[2]
>>> td
<td data-behavior="date_time" data-date="2017-10-01T22:00Z"><a data-dateformat="time1" href="/nba/game?gameId=400978817" name="&lpos=nba:schedule:time"></a></td>
>>> td.attrs
{'data-date': '2017-10-01T22:00Z', 'data-behavior': 'date_time'}
>>> td.attrs['data-date']
'2017-10-01T22:00Z'
import requests
import bs4
def date_or_text(td):
if 'data-date' in td.attrs:
return td.attrs['data-date']
return td.text
def extract_game_information(tr):
tds_with_blanks = (date_or_text(td) for td in tr.select('td'))
return [data for data in tds_with_blanks if data]
response = requests.get('http://www.espn.com/nba/schedule/_/date/20171001')
soup = bs4.BeautifulSoup(response.text, 'lxml')
data = [extract_game_information(tr) for tr in soup.select('tr')]