In Overpass search, why I am getting child nodes along with the actual matches?

I am running a search to find named way objects, like this:

[out:csv(::id,::type, ::lat,::lon, name, "addr:city"; true; ",")];
way[sport=climbing] ["name" ~ "Direct"] (37.7,-122.5,37.8,-122.3);
(._;>;);
out center;

and the output looks like this:

id,type,lat,lon,name,addr:city
4901432254,node,37.7653383,-122.4373028,
4901432255,node,37.7653393,-122.4372884,
4901432256,node,37.7653488,-122.4373064,
498803172,way,37.7653435,-122.4372974,Beaver Street Direct,

so first 3 objects not only don’t have name tag, they are not even a way type! As I understand they are found only because they are part of the 498803172 object that does matches the filter. Is there any way to exclude them from the output?

For example, replace:

nwr[sport=climbing] ["name"~"Direct"] (37.7,-122.5,37.8,-122.3);
(._;>;);

by

(
node[sport=climbing]["name"~"Direct"](37.7,-122.5,37.8,-122.3);
way[sport=climbing]["name"~"Direct"](37.7,-122.5,37.8,-122.3);
rel[sport=climbing]["name"~"Direct"](37.7,-122.5,37.8,-122.3);
);

Have a look at Overpass API/Overpass QL - OpenStreetMap Wiki

Such basic questions are addressed there in many examples.