Правильное выражение XPath с учетом ваших требований:
//p[contains(., 'A') and contains(., 'B') and strong/text() = 'test']"
Python output
>>> root.xpath("//p[contains(., 'A') and contains(., 'B') and strong/text() = 'test']")
[<Element p at 0x1075031b0>]
Проблема с вашими предлагаемыми подходами
Ваше первое решение не включает в себя все условия (текстовое содержание strong
отсутствует), а второе включает strong()
(вы, вероятно, имели в виду strong[]
).
Ваше второе предлагаемый подход может быть изменен с минимальными изменениями, с тем же выводом:
>>>> root.xpath('//p[strong[contains(text(),"test")] and contains(text(),"A") and contains(text(),"B")]')
[<Element p at 0x1075031b0>]
Разница с моим решением выше состоит в том, что я проверяю строковое значение .
, в то время как ваше решение имеет text()
.