Как получить вложенный элемент в прекрасный суп

Я борюсь с синтаксисом, необходимым для захвата некоторых hrefs в td. Элементы table, tr и td не имеют классов или идентификаторов.

Если бы я хотел захватить якорь в этом примере, что мне нужно?

<tr>   <td> <a> ...

Спасибо

Ответ 1

В соответствии с документами вы сначала создаете дерево разбора:

import BeautifulSoup
html = "<html><body><tr><td><a href='foo'/></td></tr></body></html>"
soup = BeautifulSoup.BeautifulSoup(html)

а затем вы выполните поиск в нем, например, для тегов <a>, чей непосредственный родитель является <td>:

for ana in soup.findAll('a'):
  if ana.parent.name == 'td':
    print ana["href"]

Ответ 2

Что-то вроде этого?

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [td.find('a') for td in soup.findAll('td')]

Это должно найти первое "а" внутри каждого "td" в html, который вы предоставляете. Вы можете настроить td.find, чтобы быть более конкретным, или использовать findAll, если у вас есть несколько ссылок внутри каждого td.

UPDATE: re Daniele comment, если вы хотите убедиться, что в списке нет None, тогда вы можете изменить понимание списка таким образом:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [a for a in (td.find('a') for td in soup.findAll('td')) if a]

Что в основном просто добавляет проверку, чтобы увидеть, есть ли у вас фактический элемент, возвращаемый td.find('a').