我正在从API处理以下XML,该API具有如下记录集:
<br.com.wine.sfweb.rest.controller.api.products.ProductDTO>
<sku>18683</sku>
<imageUrl>/renderImage.image?imageName=produtos/18683-01.png</imageUrl>
<id>89117</id>
<name>WineBox W Explorer Series</name>
<type>Vinho</type>
<attributes>
<marketingCampaign>estoque-limitado</marketingCampaign>
<country>Wine</country>
</attributes>
<ratings>
<averageRating>4.19</averageRating>
<numberOfRatings>21</numberOfRatings>
<histogram>
<entry>
<string>3.0</string>
<long>2</long>
</entry>
<entry>
<string>4.0</string>
<long>9</long>
</entry>
<entry>
<string>1.0</string>
<long>1</long>
</entry>
<entry>
<string>5.0</string>
<long>9</long>
</entry>
</histogram>
</ratings>
<rating>4.19</rating>
<numberOfRatings>21</numberOfRatings>
<available>true</available>
<listPrice>402.00</listPrice>
<salesPriceNonMember>402.00</salesPriceNonMember>
<salesPriceClubMember>341.70</salesPriceClubMember>
</br.com.wine.sfweb.rest.controller.api.products.ProductDTO>
我确实知道,<attributes>
子级并不总是满的,根据文档上的说明,并不是必须的。
例如,我已经使用以下方法成功处理了所有这些记录(甚至是不存在的记录):
from contextlib import suppress
with suppress(AttributeError): tipoVinho = produtos.find('attributes/type').text
with suppress(AttributeError): paisVinho = produtos.find('attributes/country').text
因此,如果<attributes><type>
不存在,它将跳过属性错误并继续前进。
现在,出乎意料的是,每当我陷入缺失的属性时,我都会遇到"name 'tipoVinho' is not defined"
错误,就像withwith抑制子句不再做任何事情一样。
我还没有升级任何东西,它只是在几天前才开始的(请注意,我在某些情况下缺少某些属性,所以这很普遍)。
我想念什么吗?
答案 0 :(得分:1)
取消显示AttributeError
时,分配被取消。毕竟,完全没有返回了右侧表达式(produtos.find().text
)。它甚至没有返回None
!相反,它引发了一个异常。这会导致tipoVinho
未定义的情况。
您将需要对特殊情况进行特殊处理,以使contextlib.suppress
不是正确的工具。相反,只需使用异常:
try:
tipoVinho = produtos.find('attributes/type').text
except AttributeError:
tipVinho = None
或在可能失败的分配之前将tipVinho
设置为某个默认值。如果这样做,请确保在每次循环迭代中将其重置!