Я не могу разобрать XML с сайта Betfair с помощью Python - PullRequest
1 голос
/ 28 апреля 2019

Мне нужно получить данные с сайта Betfair, используя Python Мне нужна ссылка: https://www.betfair.com/www/sports/exchange/readonly/v1/bymarket?_ak=nzIFcwyWhrlwYMrh&currencyCode=EUR&locale=ru&marketIds=1.158145690&rollupLimit=10&rollupModel=STAKE&types=MARKET_STATE,MARKET_RATES,MARKET_DESCRIPTION,EVENT,RUNNER_DESCRIPTION,RUNNER_STATE,RUNNER_EXCHANGE_PRICES_BEST,RUNNER_METADATA,MARKET_LICENCE

Чтобы решить эту проблему, я сохранил открытую страницу в виде xml-документа и успешно проанализировал ее с помощью этого кода

from bs4 import BeautifulSoup as bs

filedata = open('bymarket.xml')

cont = bs(filedata, 'lxml')

course = cont.find('venue')
print(course.text)
container = cont.find('runners')
item = container.find_all('runnernode')
for horse in item:
    runner = horse.find('runnername').text
    odds = horse.find('availabletolay').find('price').text
    print(runner, odds)

Используя этот код, я могу получить нужные мне результаты. Но когда я пытаюсь получить эти данные прямо со страницы, ничего не происходит - Предметы не найдены, и я получил None. Пожалуйста, помогите непрофессионалу получить нужную мне информацию

1 Ответ

0 голосов
/ 28 апреля 2019

Вам необходимо добавить к запросу заголовок Accept и указать xml parser

 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

Py:

import requests
from bs4 import BeautifulSoup as bs

headers = {
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'User-Agent': 'Mozilla/5.0'
}
r = requests.get('https://www.betfair.com/www/sports/exchange/readonly/v1/bymarket?_ak=nzIFcwyWhrlwYMrh&currencyCode=EUR&locale=ru&marketIds=1.158145690&rollupLimit=10&rollupModel=STAKE&types=MARKET_STATE,MARKET_RATES,MARKET_DESCRIPTION,EVENT,RUNNER_DESCRIPTION,RUNNER_STATE,RUNNER_EXCHANGE_PRICES_BEST,RUNNER_METADATA,MARKET_LICENCE', headers = headers)
soup = bs(r.content, 'xml')
for horse in soup.select('RunnerNode'):
    name = horse.select_one('runnerName').text
    first_availableToLay_price_size =  horse.select_one('price').text
    print(name, first_availableToLay_price_size)

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...