2016-11-12 108 views
0

我想解析一个ESPN网页,以获得日期,时间和团队在使用BeautifulSoup给定一周的每个NFL游戏中玩。我能够获得大部分信息,但是,我在时间信息方面遇到了问题。BeautifulSoup文本<a></a>不退回

出于某种原因,标签之间的文本没有被返回。

为一个HTML中的一个标签是:

<a data-dateformat="time1" name="&amp;lpos=nfl:schedule:time" href="/nfl/game?gameId=400874572">12:00 PM</a> 

我期待得到“12:00 PM”中的一个标记之间,而是我得到:

<a data-dateformat="time1" href="/nfl/game?gameId=400874572" name="&amp;lpos=nfl:schedule:time"></a> 

它在标签之间没有任何文字。

这是我用来解析网页的东西。

import urllib2 
from bs4 import BeautifulSoup 

def parse_nfl_schedule_espn(): 

    schedule = BeautifulSoup(urllib2.urlopen("http://www.espn.com/nfl/schedule/_/week/10").read(), "lxml") 

    for date in schedule.find_all('h2'): 

     #separate by game 
     game_info = date.nextSibling.find_all('tr') 

     date = str(date).split(">") 
     date = date[1].split("<") 
     date = date[0] 

     #print date 

     for i in range(len(game_info)): 

      #separate each part of game row 
      value = game_info[i].find_all('td') 

      #iterate over <thead> 
      if len(value) > 1: 

       #away team abv 
       away = str(value[0].find('abbr')).split(">") 
       away = away[1].split("<") 
       away = away[0] 

       #home team abv 
       home = str(value[1].find('abbr')).split(">") 
       home = home[1].split("<") 
       home = home[0] 

       time = value[2].find_all('a') 

       print time 

       #print "%s at %s" % (away, home) 

if __name__ == "__main__": 

    parse_nfl_schedule_espn() 

任何帮助/建议将不胜感激。

+1

那个时间是由JavaScript探测生成的。你不能用BS刮它,你将不得不使用硒 – e4c5

+0

将节点转换为字符串并在'<上分割>是什么?这就损害了使用BeautifulSoup的全部要点,它是以节点树的形式访问数据。 – spectras

+0

页面[那个](http://www.espn.com/nfl/schedule)?隐藏公共页面的网址没有任何意义,并且使它更难以帮助您。 – spectras

回答

1

您将需要使用像Selenium这样的东西来获取HTML。这将允许浏览器运行任何Javascript。

from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 

def parse_nfl_schedule_espn(): 
    browser = webdriver.Firefox(firefox_binary=FirefoxBinary()) 
    browser.get("http://www.espn.com/nfl/schedule/_/week/10") 
    schedule = BeautifulSoup(browser.page_source, "lxml") 

    for date in schedule.find_all('a', attrs={'data-dateformat' : "time1"}): 
     print date.text 

if __name__ == "__main__": 
    parse_nfl_schedule_espn() 

这将显示如下:

6:00 PM 
6:00 PM 
6:00 PM 
6:00 PM 
6:00 PM 
6:00 PM 
6:00 PM 
6:00 PM 
9:05 PM 
9:25 PM 
9:25 PM 
1:30 AM 
1:30 AM 

你也可以调查“无头”的解决方案,如PhantomJS以避免看到一个浏览器窗口中显示这可以如下完成。

相关问题