Поиск тегов и текста в BeautifulSoup - PullRequest
3 голосов
/ 08 августа 2011

У меня возникли проблемы с формулировкой запроса findAll для BeautifulSoup, который будет делать то, что я хочу.Раньше я использовал findAll для извлечения только текста из некоторого html, по существу убирая все теги.Например, если бы у меня было:

<b>Cows</b> are being abducted by aliens according to the
<a href="www.washingtonpost.com>Washington Post</a>.

Это было бы уменьшено до:

Cows are being abducted by aliens according to the Washington Post.

Я бы сделал это с помощью ''.join(html.findAll(text=True)).Это работало замечательно, пока я не решил, что хотел бы оставить только теги <a>, но убрать остальные теги.Итак, учитывая исходный пример, я бы закончил с этим:

Cows are being abducted by aliens according to the
<a href="www.washingtonpost.com>Washington Post</a>.

Сначала я думал, что сработает следующее:

''.join(html.findAll({'a':True}, text=True))

Однако это не работает, поскольку text=True, кажется, указывает, что он найдет только текст.Что мне нужно, так это какой-либо вариант ИЛИ - я бы хотел найти текстовые теги ИЛИ <a>.Важно, чтобы теги оставались вокруг текста, который они помечают, - я не могу, чтобы теги или текст появлялись не по порядку.

Есть мысли?

1 Ответ

4 голосов
/ 08 августа 2011

Примечание. BeautifulSoup.findAll - это API поиска. Первый именованный аргумент findAll, равный name, может использоваться для ограничения поиска определенным набором тегов . Только с одним findAll невозможно выделить весь текст между тегами и одновременно выбрать текст и тег для <a>. Поэтому я пришел к следующему решению.

Это решение зависит от BeautifulSoup.Tag, импортируемого.

from BeautifulSoup import BeautifulSoup, Tag

soup = BeautifulSoup('<b>Cows</b> are being abducted by aliens according to the <a href="www.washingtonpost.com>Washington Post</a>.')
parsed_soup = ''

Мы перемещаемся по дереву разбора как список с помощью метода contents. Мы извлекаем текст только в том случае, если это тег, а тег не <a>. В противном случае мы получаем всю строку с тегом. При этом используется навигация по API дерева разбора .

for item in soup.contents:
    if type(item) is Tag and u'a' != item.name:
        parsed_soup += ''.join(item.findAll(text = True))
    else:
        parsed_soup += unicode(item)

Порядок текста сохраняется .

 >>> print parsed_soup
 u'Cows are being abducted by aliens according to the <a href=\'"www.washingtonpost.com\'>Washington Post</a>.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...