Список фильтров Python для удаления определенных ссылок из исходного кода HTML - PullRequest
1 голос
/ 21 декабря 2010

У меня есть html исходный код, который я хочу отфильтровать по одной или нескольким ссылкам и сохранить остальные.

Я настроил свой фильтр с "*" в качестве подстановочного знака:

<a*>Link1</a>‚ <a*>Link2</a>‚ or <a*>Link3</a>
<a*>A bad link*</a>
some text* <a*>update*</a>
other text right before link <a*>click here</a>

Я бы хотел отфильтровать каждый экземпляр ссылки из исходного кода html, используя python.Я в порядке с загрузкой списка в массив.Мне нужна помощь с фильтром.Каждый разрыв строки будет означать отдельный фильтр, и я хочу только удалить ссылку (и), а не текст

Я все еще очень плохо знаком с python и regex / beautifulsoup.Даже если бы вы указали мне правильное направление, это было бы очень признательно.

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

Чтобы удалить <a> теги и сохранить только текст, не содержащийся в этих тегах:

>>> from BeautifulSoup import BeautifulSoup as bs
>>> markup = """<a*>Link1</a> <a*>Link2</a> or <a*>Link3</a>
... <a*>A bad link*</a>
... some text* <a*>update*</a>
... other text right before link <a*>click here</a>"""
>>> soup = bs(markup)
>>> TAGS_TO_EXTRACT = ('a',)
>>> for tag in soup.findAll():
...   if tag.name in TAGS_TO_EXTRACT:
...     tag.extract()
...
>>> soup
  or

some text*
other text right before link

Мне не ясно, хотите ли вы текст внутри тегов или нет. Если вы хотите, чтобы текст, содержащийся в тегах, делал что-то вроде этого:

>>> for tag in soup.findAll():
...   if tag.name in TAGS_TO_EXTRACT:
...     tag.replaceWith(tag.text)
...
>>> soup
Link1 Link2 or Link3
A bad link*
some text* update*
other text right before link click here
0 голосов
/ 21 декабря 2010

Синтаксический анализ с единственной попыткой пересобрать весь документ, отбрасывая только часть информации, приведет к большому количеству ненужного кода.

Итак, я думаю, что это лучше для работы с регулярными выражениями. Регулярные выражения Python могут иметь функцию обратного вызова, которая позволяет настроить строку подстановки. В этом случае достаточно просто создать регулярное выражение, которое соответствует «плохой ссылке», промежуточному тексту и разметке конечной ссылки и сохраняет только промежуточный текст.

import re

markup = """<a*>Link1</a>‚ <a*>Link2</a>‚ or <a*>Link3</a>
<a*>A bad link*</a>
some text* <a*>update*</a>
other text right before link <a*>click here</a>"""

filtered = re.sub (r"(\<a.*?>)(.*?)(\</a\s*\>)",lambda match: match.groups()[1] , markup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...