Пространство имён XML Yahoo Sports API не может найти элемент
Поэтому после выполнения запросов с помощью Yahoo API Sports я начал пытаться анализировать XML с помощью lxml в python: я попытался получить элементы после сохранения их в корне, и я могу получить доступ к дочерним тегам, если я просто использую индексирование; однако вызов что-то вроде root.find("season") ничего не возвращает. Основываясь на других сообщениях, которые я прочитал, я считаю, что это может быть связано с пространством имен, используемым в файле XML. Как мне справиться с этим, чтобы я мог приобрести нужные мне элементы?
Изменить: мои извинения за то, что не достаточно ясно. Я пытаюсь посмотреть на НФЛ QB Эндрю Лак. Код обращается к корню [0][1]. root[0] должен быть тегом player, но внутри тега player много дочерних элементов, поэтому root[0][0] является его первым дочерним элементом, тег player_key, а root[0][1] является вторым дочерним тегом player, который должен быть тегом player_id.
Но вызывая root[0].find('player_id') или любой вариант поиска, метод iter ничего не возвращает.
Спасибо еще раз за помощь!
Ниже приведен код XML
<?xml version="1.0" encoding="UTF-8"?>
<fantasy_content xml:lang="en-US" yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/player/348.p.25711/stats" time="36.563873291016ms" copyright="Data provided by Yahoo! and STATS, LLC" refresh_rate="31" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" xmlns="http://fantasysports.yahooapis.com/fantasy/v2/base.rng">
<player>
<player_key>348.p.25711</player_key>
<player_id>25711</player_id>
<name>
<full>Andrew Luck</full>
<first>Andrew</first>
<last>Luck</last>
<ascii_first>Andrew</ascii_first>
<ascii_last>Luck</ascii_last>
</name>
<editorial_player_key>nfl.p.25711</editorial_player_key>
<editorial_team_key>nfl.t.11</editorial_team_key>
<editorial_team_full_name>Indianapolis Colts</editorial_team_full_name>
<editorial_team_abbr>Ind</editorial_team_abbr>
<bye_weeks>
<week>10</week>
</bye_weeks>
<uniform_number>12</uniform_number>
<display_position>QB</display_position>
<headshot>
<url>http://l.yimg.com/iu/api/res/1.2/sm2sm277cd6oNXrZU.uiSQ--/YXBwaWQ9c2hhcmVkO2NoPTIzMzY7Y3I9MTtjdz0xNzkwO2R4PTg1NztkeT0wO2ZpPXVsY3JvcDtoPTYwO3E9MTAwO3c9NDY-/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/20141101/25711.png</url>
<size>small</size>
</headshot>
<image_url>http://l.yimg.com/iu/api/res/1.2/sm2sm277cd6oNXrZU.uiSQ--/YXBwaWQ9c2hhcmVkO2NoPTIzMzY7Y3I9MTtjdz0xNzkwO2R4PTg1NztkeT0wO2ZpPXVsY3JvcDtoPTYwO3E9MTAwO3c9NDY-/https://s.yimg.com/xe/i/us/sp/v/nfl_cutout/players_l/20141101/25711.png</image_url>
<is_undroppable>0</is_undroppable>
<position_type>O</position_type>
<eligible_positions>
<position>QB</position>
</eligible_positions>
<player_stats>
<coverage_type>season</coverage_type>
<season>2015</season>
<stats>
<stat>
<stat_id>0</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>1</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>2</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>3</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>4</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>5</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>6</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>7</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>8</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>9</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>10</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>11</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>12</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>13</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>14</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>15</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>16</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>17</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>18</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>57</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>58</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>59</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>60</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>61</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>62</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>63</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>64</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>78</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>79</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>80</stat_id>
<value>0</value>
</stat>
<stat>
<stat_id>81</stat_id>
<value>0</value>
</stat>
</stats>
</player_stats>
</player>
</fantasy_content>
Ниже приведен исходный код:
import requests
import sys
import time
import webbrowser
import requests
import xml.etree.ElementTree as ET
from oauth_hook import OAuthHook
from requests_oauthlib import OAuth1Session
from requests_oauthlib import OAuth1
from urlparse import parse_qs
from yahoo_oauth import OAuth1
file = open("data.txt",'w')
oauth = OAuth1(None,None,from_file="oauth1.json")
if not oauth.token_is_valid():
print 'not valid'
oauth.refresh_access_token()
response = oauth.session.get(url)
root = ET.fromstring(response.text.encode('utf-8'))
print root[0][1].text#prints out 25711, the player ID of Andrew Luck
1 ответ
Ваш XML имеет пространство имен по умолчанию, объявленное в корневом элементе:
xmlns="http://fantasysports.yahooapis.com/fantasy/v2/base.rng"
Элементы-потомки неявно наследуют пространство имен по умолчанию, если не указано иное. Чтобы найти элемент в пространстве имен, используя xml.etree.ElementTree
, вы можете либо создать отображение префикса в namespace-uri и использовать префикс в выражении XPath:
ns = {'d': 'http://fantasysports.yahooapis.com/fantasy/v2/base.rng'}
result = root.find('.//d:player_id', ns)
print(result.text)
или используйте namespace-uri напрямую, вот так:
result = root.find('.//{http://fantasysports.yahooapis.com/fantasy/v2/base.rng}player_id')
print(result.text)