我的目标是获取xml响应并将其保存到我的数据库中。我能够使用Elementtree
products
的第一个元素
xml看起来像这样,
<?xml version="1.0" encoding="UTF-8"?>
<products>
<item id="0">
<product_id> ...
<product_name> ...
<product_url> ...
<advertiser> ...
<designer> ...
<image_url> ...
<price> ...
<commission> ...
</item>
当我尝试迭代它时,我得到了元素,但没有为每个元素打印出的元素中的数据。
def advertisers(request):
url = 'https://api.example.com/111'
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = ElementTree.parse(response.raw)
root = tree.getroot()
for item in root:
product_id = item.find('product_id')
product_name = item.find('product_name')
product_url = item.find('product_url')
advertiser = item.find('advertiser')
designer = item.find('designer')
image_url = item.find('image_url')
price = item.find('price')
commission = item.find('commission')
print (product_id, product_name, product_url, advertiser, designer, image_url, price, commission)
return HttpResponse()
Output
<Element 'product_id' at 0x107bba6d8> <Element 'product_name' at 0x107bba728> <Element 'product_url' at 0x107bba778> <Element 'advertiser' at 0x107bba7c8> <Element 'designer' at 0x107bba818> <Element 'image_url' at 0x107bba868> <Element 'price' at 0x107bba8b8> <Element 'commission' at 0x107bba908>
如果我的模型看起来像这样,有人请告诉我如何构造此循环以将元素保存到数据库。我知道如果我循环遍历它们并附加每一组我可以调用items.save()
并且一切都应该很好。我只是想确保我先正确访问。
class Products(models.Model):
product_id = models.CharField(max_length=100)
product_name = models.CharField(max_length=100)
product_url = models.CharField(max_length=100)
advertiser = models.CharField(max_length=100)
designer = models.CharField(max_length=100)
image_url = models.CharField(max_length=100)
price = models.CharField(max_length=100)
commission = models.CharField(max_length=100)
def __str__(self):
return self.products
答案 0 :(得分:1)
如documentation中所述,iterparse()
会返回(event, elem)
对(请注意订单)。您的代码的event
和elem
变量的顺序错误,这就是为什么它始终从“end”end
打印event
。更正排序,然后您可以从elem.tag
检查当前元素名称并从elem.text
获取元素的值:
for event, elem in items:
print(elem.tag, elem.text)