Механизмы поиска BeautifulSoup принимают вызываемый вызов, который, как представляется, документы рекомендуют для вашего случая: «Если вам нужно наложить сложные или взаимосвязанные ограничения на атрибуты тега, передайте вызываемый объект для имени, ...». (хорошо ... они конкретно говорят об атрибутах, но совет отражает основополагающий дух API BeautifulSoup).
Если вы хотите однострочник:
soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))
Я использовал лямбду в этом примере, но на практике вы можете определить вызываемую функцию, если у вас есть несколько связанных требований, так как эта лямбда должна сделать два вызова findParent('strong', 'sans')
, чтобы избежать возникновения исключения, если <a>
тег не имеет strong
родителя. Используя правильную функцию, вы можете сделать тест более эффективным.