`search_companies`: AttributeError: 'list' object has no attribute 'get'
Hi, thanks for the awesome package! Was hoping you could help me with this.
Description
search_companies unable to find info for certain keyword searches.
Reprex
The following company search yields an error:
from linkedin_api import Linkedin
from decouple import config
api = Linkedin(config('LINKEDIN_USER'), config('LINKEDIN_PASS'))
companies = api.search_companies(keywords="Johnson & Johnson")
>>> companies = api.search_companies(keywords="Johnson & Johnson")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/bms20/Desktop/120-80/src/linkedin-api/linkedin_api/linkedin.py", line 460, in search_companies
data = self.search(params, **kwargs)
File "/Users/bms20/Desktop/120-80/src/linkedin-api/linkedin_api/linkedin.py", line 244, in search
data_clusters = data.get("data", []).get("searchDashClustersByAll", [])
AttributeError: 'list' object has no attribute 'get'
But i can see this same search yields multiple results on LinkedIn: https://www.linkedin.com/search/results/companies/?keywords=Johnson%20%26%20Johnson&origin=SWITCH_SEARCH_VERTICAL&sid=%3AZ2
Versions
linkedin-api 2.0.1 dev_0 <develop>
about-time 4.2.1 pyhd8ed1ab_0 conda-forge
alive-progress 3.1.4 pyhd8ed1ab_0 conda-forge
anyio 3.5.0 py39hca03da5_0
appnope 0.1.2 py39hca03da5_1001
argon2-cffi 21.3.0 pyhd3eb1b0_0
argon2-cffi-bindings 21.2.0 py39h1a28f6b_0
asttokens 2.0.5 pyhd3eb1b0_0
attrs 23.1.0 py39hca03da5_0
babel 2.11.0 py39hca03da5_0
backcall 0.2.0 pyhd3eb1b0_0
beautifulsoup4 4.12.2 py39hca03da5_0
biopython 1.78 py39h1a28f6b_0
blas 2.116 openblas conda-forge
blas-devel 3.9.0 16_osxarm64_openblas conda-forge
bleach 4.1.0 pyhd3eb1b0_0
bottleneck 1.3.5 py39heec5a64_0
brotli 1.0.9 h1a28f6b_7
brotli-bin 1.0.9 h1a28f6b_7
brotlipy 0.7.0 py39h1a28f6b_1002
bs4 4.12.2 py38hd3eb1b0_0
ca-certificates 2023.08.22 hca03da5_0
certifi 2023.7.22 py39hca03da5_0
cffi 1.15.1 py39h80987f9_3
charset-normalizer 2.0.4 pyhd3eb1b0_0
click 8.0.4 py39hca03da5_0
comm 0.1.2 py39hca03da5_0
contourpy 1.0.5 py39h525c30c_0
cryptography 41.0.3 py39hd4332d6_0
cycler 0.11.0 pyhd3eb1b0_0
debugpy 1.6.7 py39h313beb8_0
decorator 5.1.1 pyhd3eb1b0_0
defusedxml 0.7.1 pyhd3eb1b0_0
entrypoints 0.4 py39hca03da5_0
et_xmlfile 1.1.0 py39hca03da5_0
exceptiongroup 1.0.4 py39hca03da5_0
executing 0.8.3 pyhd3eb1b0_0
fonttools 4.25.0 pyhd3eb1b0_0
freetype 2.12.1 h1192e45_0
fuzzywuzzy 0.18.0 py39hca03da5_0
giflib 5.2.1 h80987f9_3
grapheme 0.6.0 pyhd8ed1ab_0 conda-forge
habanero 1.2.3 pyh1a96a4e_0 conda-forge
icu 73.1 h313beb8_0
idna 3.4 py39hca03da5_0
importlib-metadata 6.0.0 py39hca03da5_0
importlib_metadata 6.0.0 hd3eb1b0_0
importlib_resources 5.2.0 pyhd3eb1b0_1
ipykernel 6.25.0 py39h33ce5c2_0
ipython 8.15.0 py39hca03da5_0
ipython_genutils 0.2.0 pyhd3eb1b0_1
ipywidgets 8.0.4 py39hca03da5_0
iso3166 2.1.1 pyhd8ed1ab_0 conda-forge
itables 1.5.4 pypi_0 pypi
jedi 0.18.1 py39hca03da5_1
jinja2 2.11.3 pyhd3eb1b0_0
joblib 1.2.0 py39hca03da5_0
jpeg 9e h80987f9_1
json5 0.9.6 pyhd3eb1b0_0
jsonschema 4.17.3 py39hca03da5_0
jupyter_client 8.1.0 py39hca03da5_0
jupyter_contrib_core 0.4.0 pyhd8ed1ab_0 conda-forge
jupyter_contrib_nbextensions 0.5.1 pyhd8ed1ab_2 conda-forge
jupyter_core 5.3.0 py39hca03da5_0
jupyter_highlight_selected_word 0.2.0 pyhd8ed1ab_1006 conda-forge
jupyter_latex_envs 1.4.6 pyhd8ed1ab_1002 conda-forge
jupyter_nbextensions_configurator 0.6.1 pyhd8ed1ab_0 conda-forge
jupyter_server 1.13.5 pyhd3eb1b0_0
jupyterlab 3.3.2 pyhd3eb1b0_0
jupyterlab-plotly-extension 1.0.0 py_0 conda-forge
jupyterlab_server 2.10.3 pyhd3eb1b0_1
jupyterlab_widgets 3.0.5 py39hca03da5_0
kiwisolver 1.4.4 py39h313beb8_0
kneed 0.8.5 pyhd8ed1ab_0 conda-forge
lcms2 2.12 hba8e193_0
lerc 3.0 hc377ac9_0
libblas 3.9.0 16_osxarm64_openblas conda-forge
libbrotlicommon 1.0.9 h1a28f6b_7
libbrotlidec 1.0.9 h1a28f6b_7
libbrotlienc 1.0.9 h1a28f6b_7
libcblas 3.9.0 16_osxarm64_openblas conda-forge
libcxx 14.0.6 h848a8c0_0
libdeflate 1.17 h80987f9_0
libffi 3.4.4 hca03da5_0
libgfortran 5.0.0 11_3_0_hca03da5_28
libgfortran5 11.3.0 h009349e_28
libiconv 1.16 h1a28f6b_2
liblapack 3.9.0 16_osxarm64_openblas conda-forge
liblapacke 3.9.0 16_osxarm64_openblas conda-forge
libllvm14 14.0.6 h7ec7a93_3
libopenblas 0.3.21 openmp_hc731615_3 conda-forge
libpng 1.6.39 h80987f9_0
libsodium 1.0.18 h1a28f6b_0
libtiff 4.5.1 h313beb8_0
libuv 1.44.2 h80987f9_0
libwebp 1.3.2 ha3663a8_0
libwebp-base 1.3.2 h80987f9_0
libxml2 2.10.4 h0dcf63f_1
libxslt 1.1.37 h80987f9_1
linkedin-api 2.0.1 dev_0 <develop>
llvm-openmp 14.0.6 hc6e5704_0
llvmlite 0.40.0 py39h514c7bf_0
lxml 4.9.3 py39h50ffb84_0
lz4-c 1.9.4 h313beb8_0
markupsafe 2.0.1 py39h1a28f6b_0
matplotlib 3.7.2 py39hca03da5_0
matplotlib-base 3.7.2 py39h46d7db6_0
matplotlib-inline 0.1.6 py39hca03da5_0
mistune 0.8.4 py39h1a28f6b_1000
munkres 1.1.4 py_0
nbclassic 0.5.5 py39hca03da5_0
nbconvert 5.6.1 pyhd8ed1ab_2 conda-forge
nbformat 5.9.2 py39hca03da5_0
ncurses 6.4 h313beb8_0
nest-asyncio 1.5.6 py39hca03da5_0
nltk 3.8.1 py39hca03da5_0
nodejs 18.16.0 h62f6fdd_1
notebook 6.5.2 pyha770c72_0 conda-forge
notebook-shim 0.2.2 py39hca03da5_0
numba 0.57.1 py39h46d7db6_0
numexpr 2.8.4 py39h79ee842_1
numpy 1.24.3 py39h1398885_0
numpy-base 1.24.3 py39h90707a3_0
openblas 0.3.21 openmp_hf78f355_3 conda-forge
openpyxl 3.0.10 py39h1a28f6b_0
openssl 3.0.11 h1a28f6b_2
packaging 23.1 py39hca03da5_0
pandas 1.4.4 py39hc377ac9_0
pandocfilters 1.5.0 pyhd3eb1b0_0
parso 0.8.3 pyhd3eb1b0_0
pexpect 4.8.0 pyhd3eb1b0_3
pickleshare 0.7.5 pyhd3eb1b0_1003
pillow 9.4.0 py39h313beb8_1
pip 23.2.1 py39hca03da5_0
platformdirs 3.10.0 py39hca03da5_0
plotly 5.9.0 py39hca03da5_0
prometheus_client 0.14.1 py39hca03da5_0
prompt-toolkit 3.0.36 py39hca03da5_0
psutil 5.9.0 py39h1a28f6b_0
ptyprocess 0.7.0 pyhd3eb1b0_2
pure_eval 0.2.2 pyhd3eb1b0_0
pycparser 2.21 pyhd3eb1b0_0
pygments 2.15.1 py39hca03da5_1
pynndescent 0.5.10 py39hca03da5_0
pyopenssl 23.2.0 py39hca03da5_0
pyparsing 3.0.9 py39hca03da5_0
pyrsistent 0.18.0 py39h1a28f6b_0
pysocks 1.7.1 py39hca03da5_0
python 3.9.18 hb885b13_0
python-dateutil 2.8.2 pyhd3eb1b0_0
python-decouple 3.8 pyhd8ed1ab_0 conda-forge
python-fastjsonschema 2.16.2 py39hca03da5_0
python-levenshtein 0.12.2 py39h1a28f6b_0
pytrends 4.9.2 pypi_0 pypi
pytz 2023.3.post1 py39hca03da5_0
pyyaml 6.0 py39h80987f9_1
pyzmq 25.1.0 py39h313beb8_0
readline 8.2 h1a28f6b_0
regex 2022.7.9 py39h1a28f6b_0
requests 2.31.0 py39hca03da5_0
scikit-learn 1.3.0 py39h46d7db6_0
scipy 1.11.1 py39h20cbe94_0
seaborn 0.12.2 py39hca03da5_0
send2trash 1.8.0 pyhd3eb1b0_1
setuptools 68.0.0 py39hca03da5_0
six 1.16.0 pyhd3eb1b0_1
sniffio 1.2.0 py39hca03da5_1
soupsieve 2.4 py39hca03da5_0
sqlite 3.41.2 h80987f9_0
stack_data 0.2.0 pyhd3eb1b0_0
tbb 2021.8.0 h48ca7d4_0
tenacity 8.2.2 py39hca03da5_0
terminado 0.17.1 py39hca03da5_0
testpath 0.6.0 py39hca03da5_0
threadpoolctl 2.2.0 pyh0d69192_0
tk 8.6.12 hb8d0fd4_0
tornado 6.3.2 py39h80987f9_0
tqdm 4.65.0 py39h86d0a89_0
traitlets 5.7.1 py39hca03da5_0
typing-extensions 4.7.1 py39hca03da5_0
typing_extensions 4.7.1 py39hca03da5_0
tzdata 2023c h04d1e81_0
umap-learn 0.5.3 py39hca03da5_0
urllib3 1.26.16 py39hca03da5_0
wcwidth 0.2.5 pyhd3eb1b0_0
webencodings 0.5.1 py39hca03da5_1
websocket-client 0.58.0 py39hca03da5_4
wheel 0.38.4 py39hca03da5_0
widgetsnbextension 4.0.5 py39hca03da5_0
xlrd 2.0.1 pyhd3eb1b0_1
xz 5.4.2 h80987f9_0
yaml 0.2.5 h1a28f6b_0
zeromq 4.3.4 hc377ac9_0
zipp 3.11.0 py39hca03da5_0
zlib 1.2.13 h5a0b063_0
zstd 1.5.5 hd90d995_0
Ok, so I've tested this out and it seems it's related to the ampersand. This works much better.
companies = api.search_companies(keywords="Johnson and Johnson", limit=10)
companies
[{'urn_id': '1207', 'name': 'Johnson & Johnson', 'headline': 'Hospitals and Health Care • New Brunswick, NJ', 'subline': '9M followers'}, {'urn_id': '1204', 'name': 'The Janssen Pharmaceutical Companies of Johnson & Johnson', 'headline': 'Pharmaceutical Manufacturing • Raritan, New Jersey', 'subline': '997K followers'}, {'urn_id': '1193', 'name': 'Johnson & Johnson Vision', 'headline': 'Medical Equipment Manufacturing • Jacksonville, FL', 'subline': '152K followers'}, {'urn_id': '11542591', 'name': 'Johnson & Johnson MedTech', 'headline': 'Hospitals and Health Care • New Brunswick, New Jersey', 'subline': '203K followers'}, {'urn_id': '657948', 'name': 'Johnson & Johnson Medical', 'headline': 'Hospitals and Health Care', 'subline': '41K followers'}, {'urn_id': '34760890', 'name': 'Johnson & Johnson MedTech UK & Ireland 🇬🇧 🇮🇪', 'headline': 'Hospitals and Health Care • Wokingham, England', 'subline': '107K followers'}, {'urn_id': '2247', 'name': 'Johnson Controls', 'headline': 'Industrial Machinery Manufacturing • Cork, Ireland', 'subline': '1M followers'}, {'urn_id': '66923029', 'name': 'Johnson & Johnson Consumer Health', 'headline': 'Retail Health and Personal Care Products • Skillman, New Jersey', 'subline': '63K followers'}, {'urn_id': '98725034', 'name': 'Johnson & Johnson Innovative Medicine', 'headline': 'Pharmaceutical Manufacturing', 'subline': '37K followers'}, {'urn_id': '4039', 'name': 'SC Johnson', 'headline': 'Manufacturing • Racine, WI', 'subline': '402K followers'}]
Is there some known set of special characters that cause search_companies to fail?
Thanks!, Brian
Same issue since 2 weeks: https://github.com/tomquirk/linkedin-api/issues/343#issue-1898070753