Blog of :/blog/weboob/Browser2_:_La_classe_TableElement.html

Browser2 : La classe TableElement

Cet article fait partie d'une série sur le Browser2.

On a vu la classe ListElement qui itère sur les éléments d'une liste du HTML pour en sortir des objets weboob, je vais maintenant introduire la classe TableElement dont l'objet est de simplifier le traitement des tableaux

Prenons le code suivant :

class HistoryPage(HTMLPage):
    @method
    class get_history(ListElement):
        item_xpath = '//table[@class="liste"]/tbody/tr'

        class item(ItemElement):
            klass = Transaction
            condition = lambda self: len(self.el.xpath('./td')) >= 3

            obj_date = Transaction.Date('./td[1]')
            obj_raw = Transaction.Raw('./td[2]')
            obj_amount = Transaction.Amount('./td[last()]')

Grâce aux filtres, c'est parfaitement lisible, néanmoins ça souffre d'un problème. Si, comme le site du Crédit Mutuel, l'ordre des colonnes change ou des colonnes supplémentaires sont présentes (en fonction des clients), il est difficile de savoir où se trouve l'information.

Pour ce cas, la classe TableElement a été rajoutée afin de faire la sélection de la cellule non pas à partir de son index, mais à partir de son titre.

class HistoryPage(HTMLPage):
    @method
    class get_history(TableElement):
        head_xpath = '//table[@class="liste"]//thead//tr/th/text()'
        item_xpath = '//table[@class="liste"]//tbody/tr'

        col_date = u"Date de l'annonce"
        col_raw = u"Opération"
        col_amount = u"Montant"

        class item(ItemElement):
            klass = Transaction
            condition = lambda self: len(self.el.xpath('./td')) >= 3

            obj_date = Transaction.Date(TableCell('date'))
            obj_raw = Transaction.Raw(TableCell('raw'))
            obj_amount = Transaction.Amount(TableCell('amount'))

Comme on peut le voir, il suffit pour cela de fournir le xpath vers les différents titres de colonnes, ainsi que les titres associés à des identifiants. Ceux-ci peuvent alors être réutilisés dans ItemElement pour sélectionner cette cellule et la traiter dans les filtres suivants.