美丽的汤没有返回HTML文件中的所有内容?

时间:2016-04-07 19:57:29

标签: python html

HTML noob在这里,所以我可能会误解HTML文档,所以请耐心等待。

我正在使用Beautiful Soup来解析Python中的Web数据。这是我的代码:

import urllib
import BeautifulSoup

url = "http://www.nba.com/gameline/20160323/"
page = urllib.urlopen(url).read()
soup = BeautifulSoup.BeautifulSoup(page)
indicateGameDone = str(soup.find("div", {"class": "nbaModTopStatus"}))
print indicateGameDone

现在,如果您查看网站,HTML代码就行<p class="nbaLiveStatTxSm"> FINAL </p>,(在页面上的第一个ATL-WAS游戏中检查容器左侧的“最终”文本,以查看它适用于你自己。)但是当我运行上面的代码时,我的代码不会返回网页上显示的'FINAL',而nbaLiveStatTxSm类是空的。

在我的机器上,这是我打印indicateGameDone时的输出:

<div class="nbaModTopStatus"><p class="nbaLiveStatTx">Live</p><p class="nbaLiveStatTxSm"></p><p class="nbaFnlStatTx">Final</p><p class="nbaFnlStatTxSm"></p></div>

有谁知道为什么会这样?

编辑:澄清:问题是没有检索标签内的文本,问题是当我从网站上获取html代码并在python中打印出来时,我在检查元素时看到了什么Python中的print语句中没有web。

3 个答案:

答案 0 :(得分:2)

您可以使用此逻辑提取任何文本。 此代码允许您在任何标记之间提取任何数据。 输出 - 最终

import urllib
from bs4 import BeautifulSoup
url = "http://www.nba.com/gameline/20160323/"
page = urllib.urlopen(url)
soup = BeautifulSoup(page)
indicateGameDone = soup.find("div", {"class": "nbaFnlStatTx"})
for p in indicateGameDone:
    p_text = soup.find("p", {"class": "nbaFnlStatTxSm"})
    print(p_text.getText())
    break;

答案 1 :(得分:1)

看起来你的问题不在于BeautifulSoup,而在于urllib。

尝试运行以下命令

>>> import urllib
>>> url = "http://www.nba.com/gameline/20160323/"
>>> page = urllib.urlopen(url).read()
>>> page.find('<div class="nbaModTopStatus">')
44230

考虑到Beautiful Soup能够找到div本身,这并不奇怪。但是,当我们深入了解urllib实际收集的内容时,我们可以通过运行

看到<p class="nbaFnlStatTxSm">为空
>>> page[44230:45000]
'<div class="nbaModTopStatus"><p class="nbaLiveStatTx">Live</p><p class="nbaLiveStatTxSm"></p><p class="nbaFnlStatTx">Final</p><p class="nbaFnlStatTxSm"></p></div><div id="nbaGLBroadcast"><a href="/leaguepass"><img src="/.element/img/3.0/sect/gameline/broadcasters/lp.png"></a></div><div class="nbaTeamsRow"><div class="nbaModTopTeamScr nbaModTopTeamAw"><h5 class="nbaModTopTeamName awayteam">ATL</h5><img src="http://i.cdn.turner.com/nba/nba/.element/img/2.0/sect/gameline/teams/ATL.gif" width="34" height="22" title="Atlanta Hawks"><h4 class="nbaModTopTeamNum  win"></h4></div><div class="nbaModTopTeamScr nbaModTopTeamHm"><h5 class="nbaModTopTeamName hometeam">WAS</h5><img src="http://i.cdn.turner.com/nba/nba/.element/img/2.0/sect/gameline/teams/WAS.gif" width="34" '

您可以看到标记为空,因此您的问题是传递给Beautiful Soup的数据,而不是包本身。

答案 2 :(得分:0)

  1. 将beautifulsoup的导入更改为当前版本的BeautifulSoup
  2. 的正确语法
  3. 更正了构建BeautifulSoup对象的方式
  4. 修复了您的find语句,然后使用.text命令获取您所追踪的HTML中文本的字符串表示。
  5. 对上面列出的代码进行一些小修改后,代码就会运行。

    import urllib
    from bs4 import BeautifulSoup
    
    url = "http://www.nba.com/gameline/20160323/"
    page = urllib.urlopen(url).read()
    soup = BeautifulSoup(page)
    indicateGameDone = soup.find("div", {"class": "nbaModTopStatus"})
    print indicateGameDone.text ## "LiveFinal "
    

    发表评论:

    import urllib
    from bs4 import BeautifulSoup
    
    url = "http://www.nba.com/gameline/20160323/"
    page = urllib.urlopen(url).read()
    soup = BeautifulSoup(page)
    indicateGameDone = soup.find("p", {"class": "nbaFnlStatTx"})
    print indicateGameDone.text