Механизмы поиска 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
. Используя правильную функцию, вы можете сделать тест более эффективным.