Python игнорировать исключение и продолжать идти от того места, где он встретил исключение

1

У меня проблема. Я разбираю большой XML файл, используя Python. Проблема в том, что 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
    Я бы предложил связать каждую задачу проверкой на достоверность перед попыткой ее выполнить, то есть проверить, содержит ли Elements тег 'id', перед установкой user ['id'].
Теги:

3 ответа

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">&#268;iste rigole prema Spu&#382;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 раз.

  • 0
    Спасибо, это работает
3

Что бы я делал, это перебирать словарь, (я действительно люблю словари) и делать все, что вы делали раньше, но по-другому. Так же (непроверенный):

for key in dicto:
  try: user[key] = response.getElementsByTagName(dicto[key])
  except: print "mumble mumble"; continue

Не следует сильно изменять добавление данных getAttribute к вашим данным.

  • 0
    ааа мне очень нравится эта идея, сейчас попробую
2

Вы не можете вернуться в блок try после того, как будет выбрано исключение. Это просто невозможно

Однако существуют два способа разрешить разбор синтаксиса. Первое - разбить каждую операцию на собственный блок try. Не очень хороший ответ.

Лучший способ сделать это - не исключать исключения. Используйте операторы if, чтобы проверить, существуют ли данные и действительны, а не просто считать, что они есть. Таким образом, у вас есть полный контроль над тем, что происходит каждый раз, когда файл не отформатирован правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню