CI: web / docs builds failing
https://github.com/pandas-dev/pandas/runs/4101565310?check_suite_focus=true

```
>>>-------------------------------------------------------------------------
Exception in /home/runner/work/pandas/pandas/doc/source/user_guide/io.rst at block ending on line 3032
Specify :okexcept: as an option in the ipython:: block to suppress this message
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-331-4c4d77530df1> in <module>
----> 1 df = pd.read_xml(
      2     "s3://irs-form-990/201923199349319487_public.xml",
      3     xpath=".//irs:Form990PartVIISectionAGrp",
      4     namespaces={"irs": "http://www.irs.gov/efile"}
      5 )

~/work/pandas/pandas/pandas/io/xml.py in read_xml(path_or_buffer, xpath, namespaces, elems_only, attrs_only, names, encoding, parser, stylesheet, compression, storage_options)
    921     """
    922 
--> 923     return _parse(
    924         path_or_buffer=path_or_buffer,
    925         xpath=xpath,

~/work/pandas/pandas/pandas/io/xml.py in _parse(path_or_buffer, xpath, namespaces, elems_only, attrs_only, names, encoding, parser, stylesheet, compression, storage_options, **kwargs)
    722         raise ValueError("Values for parser can only be lxml or etree.")
    723 
--> 724     data_dicts = p.parse_data()
    725 
    726     return _data_to_frame(data=data_dicts, **kwargs)

~/work/pandas/pandas/pandas/io/xml.py in parse_data(self)
    387         from lxml.etree import XML
    388 
--> 389         self.xml_doc = XML(self._parse_doc(self.path_or_buffer))
    390 
    391         if self.stylesheet is not None:

~/work/pandas/pandas/pandas/io/xml.py in _parse_doc(self, raw_doc)
    536         )
    537 
--> 538         handle_data = get_data_from_filepath(
    539             filepath_or_buffer=raw_doc,
    540             encoding=self.encoding,

~/work/pandas/pandas/pandas/io/xml.py in get_data_from_filepath(filepath_or_buffer, encoding, compression, storage_options)
    599         or file_exists(filepath_or_buffer)
    600     ):
--> 601         with get_handle(
    602             filepath_or_buffer,
    603             "r",

~/work/pandas/pandas/pandas/io/common.py in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    606 
    607     # open URLs
--> 608     ioargs = _get_filepath_or_buffer(
    609         path_or_buf,
    610         encoding=encoding,

~/work/pandas/pandas/pandas/io/common.py in _get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode, storage_options)
    354 
    355         try:
--> 356             file_obj = fsspec.open(
    357                 filepath_or_buffer, mode=fsspec_mode, **(storage_options or {})
    358             ).open()

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/core.py in open(self)
    133         been deleted; but a with-context is better style.
    134         """
--> 135         out = self.__enter__()
    136         closer = out.close
    137         fobjects = self.fobjects.copy()[:-1]

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/core.py in __enter__(self)
    100         mode = self.mode.replace("t", "").replace("b", "") + "b"
    101 
--> 102         f = self.fs.open(self.path, mode=mode)
    103 
    104         self.fobjects = [f]

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/spec.py in open(self, path, mode, block_size, cache_options, **kwargs)
    974         else:
    975             ac = kwargs.pop("autocommit", not self._intrans)
--> 976             f = self._open(
    977                 path,
    978                 mode=mode,

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in _open(self, path, mode, block_size, acl, version_id, fill_cache, cache_type, autocommit, requester_pays, **kwargs)
    532             cache_type = self.default_cache_type
    533 
--> 534         return S3File(
    535             self,
    536             path,

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in __init__(self, s3, path, mode, block_size, acl, version_id, fill_cache, s3_additional_kwargs, autocommit, cache_type, requester_pays)
   1821                 self.details = s3.info(path)
   1822                 self.version_id = self.details.get("VersionId")
-> 1823         super().__init__(
   1824             s3, path, mode, block_size, autocommit=autocommit, cache_type=cache_type
   1825         )

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/spec.py in __init__(self, fs, path, mode, block_size, autocommit, cache_type, cache_options, **kwargs)
   1302         if mode == "rb":
   1303             if not hasattr(self, "details"):
-> 1304                 self.details = fs.info(path)
   1305             self.size = self.details["size"]
   1306             self.cache = caches[cache_type](

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/asyn.py in wrapper(*args, **kwargs)
     86     def wrapper(*args, **kwargs):
     87         self = obj or args[0]
---> 88         return sync(self.loop, func, *args, **kwargs)
     89 
     90     return wrapper

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/asyn.py in sync(loop, func, timeout, *args, **kwargs)
     67         raise FSTimeoutError
     68     if isinstance(result[0], BaseException):
---> 69         raise result[0]
     70     return result[0]
     71 

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/fsspec/asyn.py in _runner(event, coro, result, timeout)
     23         coro = asyncio.wait_for(coro, timeout=timeout)
     24     try:
---> 25         result[0] = await coro
     26     except Exception as ex:
     27         result[0] = ex

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in _info(self, path, bucket, key, refresh, version_id)
   1062                 else:
   1063                     try:
-> 1064                         out = await self._simple_info(path)
   1065                     except PermissionError:
   1066                         # If the permissions aren't enough for scanning a prefix

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in _simple_info(self, path)
    975         prefix = key.strip("/")
    976 
--> 977         out = await self._call_s3(
    978             "list_objects_v2",
    979             self.kwargs,

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in _call_s3(self, method, *akwarglist, **kwargs)
    235 
    236     async def _call_s3(self, method, *akwarglist, **kwargs):
--> 237         await self.set_session()
    238         s3 = await self.get_s3(kwargs.get("Bucket"))
    239         method = getattr(s3, method)

~/miniconda3/envs/pandas-dev/lib/python3.8/site-packages/s3fs/core.py in set_session(self, refresh, kwargs)
    376 
    377         conf = AioConfig(**config_kwargs)
--> 378         self.session = aiobotocore.AioSession(**self.kwargs)
    379 
    380         for parameters in (config_kwargs, self.kwargs, init_kwargs, client_kwargs):

AttributeError: module 'aiobotocore' has no attribute 'AioSession'
```

cc @pandas-dev/pandas-core 