我有点问题。我正在使用Python解析一个大的xml文件。问题是xml文件是不可预测的,有时某些元素可能不存在于xml中,因此Python会在查找时抛出异常。我希望Python简单地忽略这个异常并继续寻找下一个元素。
这是我目前的代码,但不起作用。如果它找不到它正在寻找的元素,那么只需抛出异常并继续运行try-except块。
# now we can parse the xml we fetched.
try:
user = {}
feedLinks = response.getElementsByTagName('gd:feedLink')
statistics = response.getElementsByTagName('yt:statistics')[0]
user['id'] = response.getElementsByTagName('id')[0].firstChild.data
user['channel_title'] = response.getElementsByTagName('title')[0].firstChild.data
user['profile_url'] = response.getElementsByTagName('link')[0].getAttribute('href')
user['author_name'] = response.getElementsByTagName('author')[0].firstChild.firstChild.data
user['author_uri'] = response.getElementsByTagName('uri')[0].firstChild.data
user['age'] = response.getElementsByTagName('yt:age')[0].firstChild.data
user['favourites_url'] = feedLinks[0].getAttribute('href')
user['contacts_url'] = feedLinks[1].getAttribute('href')
user['playlists'] = feedLinks[3].getAttribute('href')
user['subscriptions'] = feedLinks[4].getAttribute('href')
user['uploads'] = feedLinks[5].getAttribute('href')
user['new_subscription_videos'] = feedLinks[6].getAttribute('href')
user['statistics'] = {'last_access':statistics.getAttribute('lastWebAccess'),
'subscriber_count':statistics.getAttribute('subscriberCount'),
'video_watch_count':statistics.getAttribute('videoWatchCount'),
'view_count':statistics.getAttribute('viewCount'),
'total_upload_views':statistics.getAttribute('totalUploadViews')}
user['gender'] = response.getElementsByTagName('yt:gender')[0].firstChild.data
user['location'] = response.getElementsByTagName('yt:location')[0].firstChild.data
user['profile_pic_url'] = response.getElementsByTagName('media:thumbnail')[0].getAttribute('url')
user['username'] = response.getElementsByTagName('yt:username')[0].firstChild.data
except Exception, error:
# store the error for logging later
self.errors.append(str(error) + " from main.py:Crawler")
有人有什么想法吗?
答案 0 :(得分:3)
我要做的是遍历字典,(我真的像字典一样)并做你以前做的所有事情,但不同。像这样(未经测试):
for key in dicto:
try: user[key] = response.getElementsByTagName(dicto[key])
except: print "mumble mumble"; continue
将getAttribute
内容添加到您的数据中不需要太多修改。
答案 1 :(得分:2)
抛出异常后,您无法跳回try块。这是不可能的
但是,有两种方法可以让解析继续进行。首先是将每个操作分解为它自己的try块。不是一个很好的答案。
更好的方法是不要首先抛出异常。使用if语句来检查数据是否存在且是否有效而不是假设它是有效的。这样,您就可以完全控制每次文件格式化不正确时发生的情况。
答案 2 :(得分:1)
from lxml import etree
def parse():
xmlFileName = '/home/shariq/abc2.xml'
postsList = []
tree = etree.parse(xmlFileName)
for post in tree.xpath("//add/doc"):
thispost = {}
postxpath = tree.getpath(post)
for child in post:
fieldName = child.get("name").strip()
thispost[fieldName] = child.text
postsList.append(thispost)
return postsList
上面是将XML转换为python字典的函数。
我采用的XML格式为:
<?xml version="1.0"?>
<add>
<doc>
<field name="country">Serbia</field>
<field name="date">20110518</field>
<field name="source">Dan</field>
<field name="lang">Serbian</field>
<field name="category">news</field>
<field name="time">1305744480</field>
<field name="title">Čiste rigole prema Spužu</field>
<field name="id">4641119297</field>
</doc>
<doc>
<field name="country">France</field>
<field name="date">20110518</field>
<field name="harvest_time">1305744480</field>
<field name="source">Sport24.com</field>
<field name="source_rank">3</field>
<field name="lang">French</field>
<field name="siteurl">http://www.sport24.com</field>
<field name="category">news</field>
<field name="time">1305744480</field>
<field name="title">La plus belle pour Sharapova</field>
<field name="id">4641119295</field>
</doc>
</add>
一旦你得到字典,你的问题减少了1000次。