It assumes the contents of the span will only be text, but that might not always be case. You should use textContent instead of innerHTML if you strictly want a string to be returned to you. innerHTML has the side effect of also returning any node element (s) if there's other DOM elements in there. textContent will guard against this possibility.
What is a "span"? A span<T> is: A very lightweight abstraction of a contiguous sequence of values of type T somewhere in memory. Basically a struct { T * ptr; std::size_t size; } with a bunch of convenience methods. A non-owning type (i.e. a "reference-type" rather than a "value type"): It never allocates nor deallocates anything and does not keep smart pointers alive. It was formerly known as ...
As others have answered… div and p are “block elements” (now redefined as Flow Content) and span is an “inline element” (Phrasing Content). Yes, you may change the default presentation of these elements, but there is a difference between “flow” versus “block”, and “phrasing” versus “inline”.
What do you want to get exactly? All the values of each span, or just the value of a particular span? Side note, id is not a tag, but an attribute of the tag div (in your case).
I never said Span or div are deprecated, I find it hard to believe they will ever be deprecated. span was designed exactly for its purpose: to non semantically be able to change certain parts of text.