簡體   English   中英

美麗的湯不返回HTML文件中的所有內容嗎?

[英]Beautiful Soup not returning everything in HTML file?

HTML noob在這里,所以我可能會誤解有關HTML文檔的內容,所以請多多包涵。

我正在使用Beautiful Soup在Python中解析網絡數據。 這是我的代碼:

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打印出來時,我在檢查Web上的元素時看到的東西不是在Python的print語句中。

您可以使用此邏輯提取任何文本。 此代碼使您可以提取任何標簽之間的任何數據。 輸出-FINAL

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;

看來您的問題不在於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的數據,而不是包裝本身。

  1. 將Beautifulsoup的導入更改為當前版本的BeautifulSoup的正確語法
  2. 更正了您構造BeautifulSoup對象的方式
  3. 修復了您的find語句,然后使用.text命令來獲取您想要的HTML中文本的字符串表示形式。

對上面列出的代碼進行一些小的修改,您的代碼就會為我運行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM