diff --git a/pyfive/high_level.py b/pyfive/high_level.py
index 11c90ff..973f49d 100644
--- a/pyfive/high_level.py
+++ b/pyfive/high_level.py
@@ -3,6 +3,7 @@
 from collections import Mapping, deque, Sequence
 import os
 from io import open     # Python 2.7 requires for a Buffered Reader
+import posixpath
 
 import numpy as np
 
@@ -49,33 +50,45 @@ class Group(Mapping):
         """ Number of links in the group. """
         return len(self._links)
 
+    def _dereference(self, ref):
+        """ Deference a Reference object. """
+        if not ref:
+            raise ValueError('cannot deference null reference')
+        obj = self.file._get_object_by_address(ref.address_of_reference)
+        if obj is None:
+            dataobjects = DataObjects(self.file._fh, ref.address_of_reference)
+            if dataobjects.is_dataset:
+                return Dataset(None, dataobjects, None, alt_file=self.file)
+            return Group(None, dataobjects, None, alt_file=self.file)
+        return obj
+
     def __getitem__(self, y):
         """ x.__getitem__(y) <==> x[y] """
         if isinstance(y, Reference):
-            if not y:
-                raise ValueError('cannot deference null reference')
-            obj = self.file._get_object_by_address(y.address_of_reference)
-            if obj is None:
-                dataobjs = DataObjects(self.file._fh, y.address_of_reference)
-                if dataobjs.is_dataset:
-                    return Dataset(None, dataobjs, None, alt_file=self.file)
-                return Group(None, dataobjs, None, alt_file=self.file)
-            return obj
-
-        y = y.strip('/')
-
-        if y not in self._links:
-            raise KeyError('%s not found in group' % (y))
-
-        if self.name == '/':
-            sep = ''
+            return self._dereference(y)
+
+        path = posixpath.normpath(y)
+        if path == '.':
+            return self
+        if path.startswith('/'):
+            return self.file[path[1:]]
+
+        if posixpath.dirname(path) != '':
+            next_obj, additional_obj = path.split('/', 1)
         else:
-            sep = '/'
+            next_obj = path
+            additional_obj = '.'
+
+        if next_obj not in self._links:
+            raise KeyError('%s not found in group' % (next_obj))
 
-        dataobjs = DataObjects(self.file._fh, self._links[y])
+        obj_name = posixpath.join(self.name, next_obj)
+        dataobjs = DataObjects(self.file._fh, self._links[next_obj])
         if dataobjs.is_dataset:
-            return Dataset(self.name + sep + y, dataobjs, self)
-        return Group(self.name + sep + y, dataobjs, self)
+            if additional_obj != '.':
+                raise KeyError('%s is a dataset, not a group' % (obj_name))
+            return Dataset(obj_name, dataobjs, self)
+        return Group(obj_name, dataobjs, self)[additional_obj]
 
     def __iter__(self):
         for k in self._links.keys():

Access values with path
One thing that is not yet possible and that would help a lot. For example, with version 0.2.0:
Using Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2

> > > import h5py
> > > import pyfive
> > > 
> > > f5 = h5py.File('tests/latest.hdf5')
> > > f5["group1/subgroup1/dataset3"].value
> > > array([ 0.,  1.,  2.,  3.], dtype=float32)
> > > ffive = pyfive.File('tests/latest.hdf5')
> > > ffive["group1/subgroup1/dataset3"].value
> > > Traceback (most recent call last):
> > >   File "<stdin>", line 1, in <module>
> > >   File "pyfive/high_level.py", line 48, in **getitem**
> > >     raise KeyError('%s not found in group' % (y))
> > > KeyError: 'group1/subgroup1/dataset3 not found in group'

diff --git a/tests/test_high_level.py b/tests/test_high_level.py
index 593ad24..9e14af3 100644
--- a/tests/test_high_level.py
+++ b/tests/test_high_level.py
@@ -138,3 +138,20 @@ def test_dataset_class():
 
         assert dset1.parent.name == '/'
         assert dset2.parent.name == '/group1'
+
+
+def test_get_objects_by_path():
+    # gh-15
+
+    with pyfive.File(EARLIEST_HDF5_FILE) as hfile:
+        grp = hfile['/group1']
+
+        assert hfile['/group1/subgroup1'].name == '/group1/subgroup1'
+        assert grp['/group1/subgroup1'].name == '/group1/subgroup1'
+
+        dset2 = hfile['group1/dataset2/']
+        assert dset2.name == '/group1/dataset2'
+
+        assert_raises(KeyError, hfile.__getitem__, 'group1/fake')
+        assert_raises(KeyError, hfile.__getitem__, 'group1/subgroup1/fake')
+        assert_raises(KeyError, hfile.__getitem__, 'group1/dataset2/fake')

pip install -e .
parse_log_pytest
pytest
nose pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
nose==1.3.7
numpy==1.19.5
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
-e git+https://github.com/jjhelmus/pyfive.git@bdddda56cfcc51548f8a553bac96adc9919594ad#egg=pyfive
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: pyfive
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - nose==1.3.7
      - numpy==1.19.5
prefix: /opt/conda/envs/pyfive

tests/test_high_level.py::test_get_objects_by_path
tests/test_high_level.py::test_file_class tests/test_high_level.py::test_group_class tests/test_high_level.py::test_dataset_class
pyfive/high_level.py
pyfive/high_level.py