尝试使用请求和lxm从goodreads API读取XML失败

2024-09-28 19:04:29 发布

您现在位置:Python中文网/ 问答频道 /正文

Goodreads声称我可以得到以根<GoodreadsResponse>开头的XML,它的第一个子级是<book>,第八个子级是image_url。问题是,我无法让它识别正确的根(它打印root而不是{}),并且根本无法识别根有任何子级,尽管响应代码是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的信息如下:

^{pr2}$

Tags: imagejsonparserurlmainstatusresroot
2条回答

以下是最适合我的解决方案:

导入请求 从bs4导入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内容被包装在标记中。使用漂亮的Soup“lxml-xml”解析器,而不是“lxml”,保留了CDATA标记中包含的内容,并允许它们被正确地解析。在

现在您的请求是HTML而不是XML。 您需要设置所需响应的格式:https://www.goodreads.com/book/isbn/ISBN?format=FORMAT

你需要使用params而不是payload: Constructing requests with URL Query String in Python

另外,对于您正在执行的请求,您可以使用JSON。 https://www.goodreads.com/api/index#book.show_by_isbn

相关问题 更多 >