If you add PARSE_DETAILED_PROCESSING_RECORD as an option to your call to index.parse() you'll get access to the preprocessor nodes.
index = clang.cindex.Index.create()
tu = index.parse(filename, options=clang.cindex.TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD)
This option maps to the following libclang C API option value. There's a comment there that includes some more context.
/**
* \brief Used to indicate that the parser should construct a "detailed"
* preprocessing record, including all macro definitions and instantiations.
*
* Constructing a detailed preprocessing record requires more memory
* and time to parse, since the information contained in the record
* is usually not retained. However, it can be useful for
* applications that require more detailed information about the
* behavior of the preprocessor.
*/
CXTranslationUnit_DetailedPreprocessingRecord = 0x01,