2016-08-22 6 views
3

現在、Rio2016でセルビアが果たすマッチ結果を収集するために、Python 3.4とbs4を使用してWebページをクロールしています。したがって、URL hereには、彼女がプレイしたすべての試合結果へのリンクが含まれています(例:this)。pythonとbeautifulsoupを使用してウェブページ内の一部のhrefをクロールできません

<a href="/en/volleyball/women/7168-serbia-italy/post" ng-href="/en/volleyball/women/7168-serbia-italy/post"> 
    <span class="score ng-binding">3 - 0</span> 
</a> 

しかし、いくつかの試験の後、このhref="/en/volleyball/women/7168-serbia-italy/post"は表示されません:

それから私は、リンクが、このようなhtmlソースに位置していることがわかりました。次に、次のコードを実行して、URLからすべてのhrefを取得しようとしました。

from bs4 import BeautifulSoup 
import requests 

Countryr = requests.get('http://rio2016.fivb.com/en/volleyball/women/teams/srb-serbia#wcbody_0_wcgridpadgridpad1_1_wcmenucontent_3_Schedule') 
countrySoup = BeautifulSoup(Countryr.text) 

for link in countrySoup.find_all('a'): 
    print(link.get('href')) 

次に、奇妙なことが起こりました。 href="/en/volleyball/women/7168-serbia-italy/post"は出力にまったく含まれていません。

私はこのHREFは、タブページ側でhref="#scheduldedOver"このURLの一つに位置していることが判明し、それは次のHTMLコードによって制御されます。

<nav class="tabnav"> 
    <a href="#schedulded" ng-class="{selected: chosenStatus == 'Pre' }" ng-click="setStatus('Pre')" ng-href="#schedulded">Scheduled</a> 
    <a href="#scheduldedLive" ng-class="{selected: chosenStatus == 'Live' }" ng-click="setStatus('Live')" ng-href="#scheduldedLive">Live</a> 
    <a href="#scheduldedOver" class="selected" ng-class="{selected: chosenStatus == 'Over' }" ng-click="setStatus('Over')" ng-href="#scheduldedOver">Complete</a> 
</nav> 

は、その後どのように私はBeautifulSoup内部を使用してHREFを取得する必要がありますタブページ?

+0

データが別のURLから来ているので、あなたがソースコードでそのURLを見つけることができません - http://rio2016.fivb.com/en/ api/volley/matches/WOG2016/ja/user/team/3017にあります。そのURLを構築するには、 'data-servicetemammatches ='をソースコード –

+0

ありがとう!だから私は正しいURLを取得し、それはプレーンテキストファイルだけであるようだ。それは、ここで行われた美しい意味ですか、私は情報を取得するために他の検索文字列関数を使用する必要がありますか? 私は次のように試してみましたが、 'matchSoup'はそれを分けるクラスがなくても長い文字列であるようです。 ' Matchr = requests.get( 'http://rio2016.fivb.com' + linkUrl) matchSoup = BeautifulSoup Matchr.text) print(matchSoup。テキスト) ' – Benson

答えて

1

データは動的に作成されます。実際のソースを見ると、Angularjsテンプレートが表示されます。

あなたはまだソースにyuuuuouも同様のdiv見ることができ、AJAX呼び出しを模倣することにより、JSON形式ですべての情報を取得することができます:

data-servicematchcenterbarのhrefを使用して

<div id="AngularPanel" class="main-wrapper" ng-app="fivb" 
data-servicematchcenterbar="/en/api/volley/matches/341/en/user/lives" 
data-serviceteammatches="/en/api/volley/matches/WOG2016/en/user/team/3017" 
data-servicelabels="/en/api/labels/Volley/en" 
data-servicelive="/en/api/volley/matches/WOG2016/en/user/live/"> 

はあなたにすべての情報を与えます

{"Id": 7168, "MatchNumber": "006", "TournamentCode": "WOG2016", "TournamentName": "Women's Olympic Games 2016", 
     "TournamentGroupName": "", "Gender": "", "LocalDateTime": "2016-08-06T22:35:00", 
     "UtcDateTime": "2016-08-07T01:35:00+00:00", "CalculatedMatchDate": "2016-08-07T03:35:00+02:00", 
     "CalculatedMatchDateType": "user", "LocalDateTimeText": "August 06 2016", 
     "Pool": {"Code": "B", "Name": "Pool B", "Url": "/en/volleyball/women/results and ranking/round1#anchorB"}, 
     "Round": 68, 
     "Location": {"Arena": "Maracanãzinho", "City": "Maracanãzinho", "CityUrl": "", "Country": "Brazil"}, 
     "TeamA": {"Code": "SRB", "Name": "Serbia", "Url": "/en/volleyball/women/teams/srb-serbia", 
        "FlagUrl": "/~/media/flags/flag_SRB.png?h=60&w=60"}, 
     "TeamB": {"Code": "ITA", "Name": "Italy", "Url": "/en/volleyball/women/teams/ita-italy", 
        "FlagUrl": "/~/media/flags/flag_ITA.png?h=60&w=60"}, 
     "Url": "/en/volleyball/women/7168-serbia-italy/post", "TicketUrl": "", "Status": "Over", "MatchPointsA": 3, 
     "MatchPointsB": 0, "Sets": [{"Number": 1, "PointsA": 27, "PointsB": 25, "Hours": 0, "Minutes": "28"}, 
            {"Number": 2, "PointsA": 25, "PointsB": 20, "Hours": 0, "Minutes": "25"}, 
            {"Number": 3, "PointsA": 25, "PointsB": 23, "Hours": 0, "Minutes": "27"}], 
     "PoolRoundName": "Preliminary Round", "DayInfo": "Weekend Day", 
     "WeekInfo": {"Number": 31, "Start": 7, "End": 13}, "LiveStreamUri": ""}, 

することができます:JSONで

from bs4 import BeautifulSoup 
import requests 
from urlparse import urljoin 

r = requests.get('http://rio2016.fivb.com/en/volleyball/women/teams/srb-serbia#wcbody_0_wcgridpadgridpad1_1_wcmenucontent_3_Schedule') 
soup = BeautifulSoup(r.content) 

base = "http://rio2016.fivb.com/" 

json = requests.get(urljoin(base, soup.select_one("#AngularPanel")["data-serviceteammatches"])).json() 

次のような出力が表示されます。あなたが必要とするものをそれらから解析します。

+0

ありがとう@パドラック!それは非常に明確で、今私はリンクを得ることができます。 – Benson

+0

@Benson、いいえ、あなたは大歓迎です。 –

1

あなたの助けをありがとう、今私は正しいURLを得ることができます。私にとっては良い学習体験です。どうもありがとう:)

from bs4 import BeautifulSoup 
import requests 

Countryr = requests.get('http://rio2016.fivb.com/en/volleyball/women/teams/srb-serbia#wcbody_0_wcgridpadgridpad1_1_wcmenucontent_3_Schedule') 
countrySoup = BeautifulSoup(Countryr.text) 

for link in countrySoup.find_all('div', {'id': 'AngularPanel'}): 
    linkUrl = link.get('data-serviceteammatches') 

json = requests.get('http://rio2016.fivb.com' + linkUrl).json() 

for item in json: 
    print(item.get('Url')) 

出力:

/en/volleyball/women/7168-serbia-italy/post 
/en/volleyball/women/7172-serbia-puerto rico/post 
/en/volleyball/women/7177-usa-serbia/post 
/en/volleyball/women/7181-china-serbia/post 
/en/volleyball/women/7187-serbia-netherlands/post 
/en/volleyball/women/7195-russia-serbia/post 
/en/volleyball/women/7198-serbia-usa/post 
/en/volleyball/women/7200-china-serbia/post 
関連する問題