Python 2.7 网页抓取-获取';布拉布拉赫';从<;td foo=blahblah>;文本</td>;使用bs4?

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

我正试图从ESPN中搜集一些时间表:

我的代码工作正常,只是输出缺少日期信息:

[
    "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="&amp;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="&amp;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')]