I’m parsing webpages on a site displaying item data. These items have about 20 fields which may or may not occur — say: price, quantity, last purchased, high, low, etc.
I’m currently using a series of commands; about 20 lines of soup.find('div',{'class':SOME_FIELD_OF_INTEREST}) to look for each separate field of interest. (Some are in div, span, dd, and so on, so it’s difficult to just do a soup.find_all('div') command.)
My question: Is there an elegant way to try and except everything such that the viewing of said code can be more compact or concise? Right now a sample line would look like:
try:
soup.find('div', {'id':'item-pic'}).img["src"]
except:
""
I was hoping to combine everything in one line. I don’t think I can syntactically run try: <line of code> except: <code>, and I’m not sure how I’d write a function that goes try_command(soup.find('div',{'id':'item-pic'}).img["src"]) without actually running the command.
I’d love to hear if anybody has any advice (including: “this isn’t possible/practical, move on”). 🙂
EDIT: After talking a bit, I guess I wanted to see what is good practice for inline exception handling, and if that’s the right route to take.
maybe something like that:
where you can pass
strto get attribute from object ortuple(str method, tuple params), finally you’ll getNoneor result. I’m not familiar with soup so I’m not sure ifget('src')would be a good approach (as probably its not a dict), anyway you can easily modify that snippet to accept something more than only ‘call or attr’.Inspired by your question I wrote simple python module that helps to deal with such situation, you can find it here
there is more possibilities