The problem with the obj format is that it isn't standardised. So you'll see some that use clockwise winding (not good for a naive implementation in OpenGL) some that use counter-clockwise winding (not good for a naive implementation in DirectX) plus all other kinds of quirks that are vendor-dependent (eg. triangles vs quads as primitives).
The most usual implementation is an index based list.
v starts a line that contains information referring to vertices' geometry (their position, with 3 coordinates).
The next type of starts with vt followed by two numbers referring to texture coordinates.
The last type is vn which contains the normal vector for every vertex (useful for Gouraud or Phong shading).
The last important part starts with f, meaning face. Usually these are triangles but you may encounter quads. Lines that start with f may look like this : f 1/1/1 2/2/2 3/5/3.
That means you have three vertices:
1st vertex uses the position on the first line that starts with V , the texture coordinates on the 1st line that starts with vt and so on for vn.
The third index uses the information referenced in the fifth line that uses vn, while the other two paramters are from their respective third lines.
Knowing this, it is very easy to make an OBJ parser that reads such files, as long as you keep it simple and don't try to cover all cases (clock-wise counterCW , quds vs triangles) and so on.