Неудачные попытки чтения XML из API Goodreads с использованием запросов и lxml - PullRequest
0 голосов
/ 28 августа 2018

Goodreads утверждает, что я могу получить XML, который начинается с корня с именем <GoodreadsResponse>, чей 1-й дочерний элемент равен <book>, 8-й дочерний элемент которого равен image_url. Проблема в том, что я не могу заставить его распознать правильный корень (он печатает root, а не GoodreadsResponse и не может распознать, что у корня вообще есть дочерние элементы, хотя код ответа 200. Я предпочитаю работать с JSON и, как утверждается, вы можете конвертировать его в JSON, но мне повезло с этим.

Вот функция, которая у меня есть на данный момент. Куда я иду не так?

def main(url, payload):
    """Retrieves image from Goodreads API endpoint returning XML response"""
    res = requests.get(url, payload)
    status = res.status_code
    print(status)
    parser = etree.XMLParser(recover=True)
    tree = etree.fromstring(res.content, parser=parser)
    root = etree.Element("root")
    print(root.text)

if __name__ == '__main__':
    main("https://www.goodreads.com/book/isbn/", '{"isbns": "0441172717", "key": "my_key"}')

Информация о Goodreads находится здесь:

**Get the reviews for a book given an ISBN**
Get an xml or json response that contains embed code for the iframe reviews widget that shows excerpts (first 300 characters) of the most popular reviews of a book for a given ISBN. The reviews are from all known editions of the book. 
URL: https://www.goodreads.com/book/isbn/ISBN?format=FORMAT    (sample url) 
HTTP method: GET 

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вот решение, которое работает лучше всего для меня:

запросы на импорт из bs4 import BeautifulSoup

def main():
    key = 'myKey'
    isbn = '0441172717'
    url = 'https://www.goodreads.com/book/isbn/{}?key={}'.format(isbn, key)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "lxml-xml")
    print(soup.find('image_url').text)

Проблема заключалась в том, что содержимое XML было заключено в теги. Использование синтаксического анализатора Beautiful Soup 'lxml-xml' вместо 'lxml' сохранило содержимое, включенное в теги CDATA, и позволило их правильно проанализировать.

0 голосов
/ 28 августа 2018

В данный момент вы получаете HTML, а не XML с вашим запросом. Вам необходимо установить желаемый формат ответа: https://www.goodreads.com/book/isbn/ISBN?format=FORMAT

И вам нужно использовать параметры, а не полезную нагрузку: Построение запросов с помощью строки URL-запроса в Python

P.S. Для запроса вы можете использовать JSON. https://www.goodreads.com/api/index#book.show_by_isbn

...