HTML использует классы (много), что делает их удобными для перехвата запросов XPath.Однако XPath не знает и не поддерживает классы CSS (или даже разделенные пробелами списки), что делает проверку задниц болью в проверке: канонически правильный способ поиска элементов, имеющих определенный класс:
//*[contains(concat(' ', normalize-space(@class), ' '), '$className')]
В вашем случае это
el = doc.xpath(
"//div[contains(concat(' ', normalize-space(@class), ' '), 'channel')]"
)
# print(el)
# [<Element div at 0x7fa44e31ccc8>, <Element div at 0x7fa44e31c278>, <Element div at 0x7fa44e31cdb8>]
или используйте собственную функцию XPath hasclass (* классы)
def _hasaclass(context, *cls):
return "your implementation ..."
xpath_utils = etree.FunctionNamespace(None)
xpath_utils['hasaclass'] = _hasaclass
el = doc.xpath("//div[hasaclass('channel')]")