@effigies you are correct. I think there are quite a few unpublished fixes, but if you install dicom_parser from master you should be able to get a dictionary of the parsed values, e.g.:
>>> from dicom_parser import Header
>>> dcm_path = "/some/siemens/image.dcm"
>>> header = Header(dcm_path)
>>> csa = header.get(("0029", "1020"))
>>> csa.keys()
dict_keys(['UsedPatientWeight', 'NumberOfPrescans', 'TransmitterCalibration', 'PhaseGradientAmplitude', 'ReadoutGradientAmplitude', 'SelectionGradientAmplitude', 'GradientDelayTime', 'RfWatchdogMask', 'RfPowerErrorIndicator', 'SarWholeBody', 'Sed', 'SequenceFileOwner', 'Stim_mon_mode', 'Operation_mode_flag', 'dBdt_max', 't_puls_max', 'dBdt_thresh', 'dBdt_limit', 'SW_korr_faktor', 'Stim_max_online', 'Stim_max_ges_norm_online', 'Stim_lim', 'Stim_faktor', 'CoilForGradient', 'CoilForGradient2', 'CoilTuningReflection', 'CoilId', 'MiscSequenceParam', 'MrProtocolVersion', 'DataFileName', 'RepresentativeImage', 'PositivePCSDirections', 'RelTablePosition', 'ReadoutOS', 'LongModelName', 'SliceArrayConcatenations', 'SliceResolution', 'AbsTablePosition', 'AutoAlignMatrix', 'MeasurementIndex', 'CoilString', 'PATModeText', 'PatReinPattern', 'ProtocolChangeHistory', 'Isocentered', 'MrPhoenixProtocol', 'GradientMode', 'FlowCompensation', 'PostProcProtocol', 'RFSWDOperationMode', 'RFSWDMostCriticalAspect', 'SARMostCriticalAspect', 'TablePositionOrigin', 'MrProtocol', 'MrEvaProtocol', 'VFModelInfo', 'VFSettings', 'AutoAlignData', 'FmriModelParameters', 'FmriModelInfo', 'FmriExternalParameters', 'FmriExternalInfo', 'FmriAcquisitionDescriptionSequence', 'B1rms', 'B1rmsSupervision', 'TalesReferencePower', 'PhaseSliceOversampling', 'SafetyStandard', 'DICOMImageFlavor', 'DICOMAcquisitionContrast', 'EchoTrainLength', 'RFEchoTrainLength', 'GradientEchoTrainLength', 'Laterality4MF', 'ArterialSpinLabelingContrast', 'ConfigFileInfo', 'UserDefinedSeries', 'AASpineModelVerificationStatus', 'AASpineModelData'])
>>> csa.get("MrProtocolVersion")
{'index': 28, 'VR': 'IS', 'VM': 1, 'value': 51130001}
>>> nested = csa.get("MrPhoenixProtocol")["value"]
>>> nested.keys()
dict_keys(['Version', 'SequenceFileName', 'ProtocolName', 'EVAProt', 'ReferenceImage0', 'ReferenceImage1', 'ReferenceImage2', 'ScanRegionPosTra', 'ScanRegionPosValid', 'PtabAbsStartPosZ', 'PtabAbsStartPosZValid', 'TablePositioningMode', 'EnableNoiseAdjust', 'Contrasts', 'CombinedEchoes', 'DisableChangeStoreImages', 'AAMode', 'AARegionMode', 'AARefMode', 'ReconstructionMode', 'OneSeriesForAllMeas', 'PHAPSMode', 'WrapUpMagn', 'Averages', 'AveragesDouble', 'Repetitions', 'ScanTimeSec', 'TotalScanTimeSec', 'RefSNR', 'RefSNR_VOI', 'MotionCorr', 'ParadigmPeriodicity', 'CineMode', 'SequenceType', 'CoilCombineMode', 'FlipAngleMode', 'TOM', 'ProtID', 'SequenceID', 'ReadOutMode', 'Bold3dPace', 'ForcePositioningOnNDIS', 'InteractiveRealtime', 'InternalTablePosValid', 'TmapB0Correction', 'TmapEval', 'TmapImageType', 'OrganUnderExamination', 'TissueT1', 'TissueT2', 'InvContrasts', 'ReaquisitionMode', 'ProtConsistencyInfo', 'GRADSPEC', 'TXSPEC', 'RXSPEC', 'AdjData', 'TR', 'TR[0]', 'TI', 'TI[0]', 'TD', 'TE', 'TE[0]', 'FlowComp', 'FlowComp[0]', 'SliceArray', 'GroupArray', 'RSatArray', 'NavigatorArray', 'AutoAlign', 'NavigatorPara', 'BladePara', 'PrepPulses', 'KSpace', 'FastImaging', 'PhysioImaging', 'SpecPara', 'Diffusion', 'Angio', 'PreScanNormalizeFilter', 'DistortionCorrFilter', 'NoiseDecorrData', 'Pat', 'Mds', 'AAInitialOffset', 'RepetitionsDelayTimeMs', 'FlipAngleDegree', 'FlipAngleDegree[0]', 'ServicePara', 'PerProxy2Skip', 'CoilSelectMeas', 'CoilSelectUI', 'EFISPEC', 'WipMemBlock', 'BOLDParadigmArray', 'BOLDParadigmArray[0]', 'ParametricMapping', 'IR', 'Asl', 'InversionArray', 'Workflow', 'DynDistCorrFilter', 'ChannelMatrix', 'PTXData', 'InlineCardioEval', 'Interactive', 'DixonData', 'DynmicAdjustVolumes', 'SliceAcceleration'])
>>> nested["SliceArray"]["Mode"]
4
Current implementation is far from perfect, but it is entirely functional. @Chris_Rorden I hope this is what you meant, in any case I would be very grateful for any comments.
HTH