Here is a different notebook salvager than in the kb article Sean pointed to.
Neither is always better. This is the one I start with.
With either of these methods,
please make a copy of the damaged notebook file and operate on the copy.
Evaluate this cell to define the function.
RecreateNotebook[fileName_String]:=
Module[{nb=NotebookCreate[],strm=OpenRead[fileName,BinaryFormat->True],result,cell,
tmpChar,beginPos,endPos},
While[(result=Find[strm,{"Cell[\"","Cell[BoxData[","Cell[TextData["}])=!=EndOfFile,
beginPos=SetStreamPosition[strm,StreamPosition[strm]-StringLength[result]];
Quiet[cell=Check[Read[strm,Expression],tmpChar=" ";endPos=StreamPosition[strm];
While[tmpChar=!=","&&endPos>beginPos+1,SetStreamPosition[strm,--endPos];
tmpChar=Read[strm,Character]];
If[endPos>beginPos,SetStreamPosition[strm,beginPos];
ToExpression@StringJoin@ReadList[strm,Character,endPos-beginPos],$Failed]]];
If[Head[cell]===Cell,NotebookWrite[nb,cell,After]];];
Close[strm];]
Put the path to the corrupted notebook into the following function call.
Insert menu - File Path might be useful for finding the file and automatically
inserting it as the function argument.
RecreateNotebook[ ]