soupe à l'oignon means soup with onion, whereas soupe de poisson refers more to soup that is made of fish.
If you had soupe au poisson, it would mean that it's a soup with fish in it, and on the opposite if you had soupe d' oignon, it would be a soup which mostly consists of onion.
And I guess the article
l' is here for the same reason, and there is an article in the sentence soupe au poisson (it has undergone an elision,
au is the contraction of
The difference is quite not obvious, even more if French is not your mothertongue.
Can't argue it's like, the classiest language ever, though.