No se puede rastrear algo de href en una página web usando python y beautifulsoup

Actualmente estoy rastreando una página web con Python 3.4 y bs4 para recostackr los resultados de los partidos jugados por Serbia en Rio2016. Así que la url aquí contiene enlaces a todos los resultados de los partidos que jugó, por ejemplo, esto .

Luego encontré que el enlace se encuentra en la fuente html de esta manera:

 3 - 0  

Pero después de varios ensayos, este href="https://stackoverflow.com/en/volleyball/women/7168-serbia-italy/post" nunca se presenta. Luego intenté ejecutar el siguiente código para obtener todos los href de la 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('a'): print(link.get('href')) 

Entonces algo extraño sucedió. El href="https://stackoverflow.com/en/volleyball/women/7168-serbia-italy/post" no está incluido en la salida en absoluto.

Encontré que este href está ubicado en una de las páginas de pestaña href="#scheduldedOver" en el lado de esta URL, y está controlado por el siguiente código HTML:

  

Entonces, ¿cómo debo obtener el href usando BeautifulSoup dentro de una página de tabs?

Los datos se crean dinámicamente, si observa la fuente real puede ver las plantillas de Angularjs .

Aún puede obtener toda la información en formato json imitando una llamada ajax, en la fuente yuuuuou también puede ver un div como:

 

El uso de data-servicematchcenterbar href le dará toda la información:

 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() 

En json verás una salida como:

 {"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": ""}, 

Puedes analizar lo que necesites de esos.

Gracias por toda su ayuda ahora puedo obtener la url correcta. Es una buena experiencia de aprendizaje para mí. Muchas gracias 🙂

 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')) 

salida:

 /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