поиск тега на основе того, что он окружает (с помощью beautifulsoup)

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Я использую BeautifulSoup для синтаксического анализа некоторого HTML. Допустим, у меня есть следующий HTML-код в BeautifulSoup под названием soup:

 <td class="1">test1</td>
<td>test2</td>
<td class="3"><a href="/">test3</a></td>
<td><div class="test4"><a class="test4" href="/">test4</a></div></td>
<td><div class="test4"><a class="test4" href="/">test4</a></div></td>
  

Я могу получить все элементы с тегами ‘td’ с помощью:

 soup.findAll("td")
  

Но как я могу найти только теги ‘td’, которые окружают divs, имеющие класс test4? Или которые окружают теги ‘a’ с помощью test4?

Я знаю, что могу находить теги с атрибутами, такими как:

 soup.findAll("a", {"class":"test4"})
  

Но мне нужно объединить это с начальным поиском ‘td’, чтобы я выбросил все теги ‘td’, которые не окружают теги ‘a’ или ‘div’.

Идеи? Спасибо!

Комментарии:

1. Когда вы говорите «окружать», вы имеете в виду «являются родителями» или «являются предками»?

Ответ №1:

Это работает, только если непосредственным родителем элемента test4 является td, но это должно дать вам представление о том, как выполнить более сложный запрос:

 >>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''<td class="1">test1</td>
... <td>test2</td>
... <td class="3"><a href="/">test3</a></td>
... <td><div class="test4"><a class="test4" href="/">test4</a></div></td>
... <td><div class="test4"><a class="test4" href="/">test4</a></div></td>
... ''')
>>> [tag.parent for tag in soup.findAll(attrs = {"class": "test4"})
...  if tag.name in ['a', 'div'] and tag.parent.name == 'td']
[<td><div class="test4"><a class="test4" href="/">test4</a></div></td>, <td><div class="test4"><a class="test4" href="/">test4</a></div></td>]
  

Ответ №2:

Вот как я бы это сделал:

 >>> tdList = []
>>> for td in soup.findAll('td'):
...     for div in td.findAll('div',{'class':'test4'}):
...         tdList.append(div.parent)
... 
>>> tdList
[<td><div class="test4"><a class="test4" href="/">test4</a></div></td>, <td><div class="test4"><a class="test4" href="/">test4</a></div></td>]
  

Конечно, вы могли бы увеличить степень детализации настолько, насколько это необходимо, но для предоставленного html это выполняет свою работу.