Как заменить ссылки, используя lxml и iterlinks - PullRequest
6 голосов
/ 26 апреля 2011

Я новичок в lxml и пытаюсь понять, как переписать ссылки, используя iterlinks ().

import lxml.html
html = lxml.html.document_fromstring(doc)
for element, attribute, link, pos in html.iterlinks():
    if attibute == "src":
         link = link.replace('foo', 'bar')
print lxml.html.tostring(html)

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

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 27 апреля 2011

Вместо того, чтобы просто присваивать новое (строковое) значение имени переменной link, вам нужно изменить сам элемент, в этом случае, установив его атрибут src:

new_src = link.replace('foo', 'bar') # or element.get('src').replace('foo', 'bar')
element.set('src', new_src)

Примечаниечто - если вы знаете, какие «ссылки» вас интересуют, например, только элементы img - вы также можете получить элементы, используя .findall() (или селекторы xpath или css) вместо .iterlinks().

1 голос
/ 19 июля 2012

lxml предоставляет метод rewrite_links (или функцию, по которой вы передаете текст для анализа в документ), чтобы обеспечить метод изменения всех ссылок в документе:

.rewrite_links (link_repl_func, resol_base_href = True, base_href = None): Это переписывает все ссылки в документе, используя заданную вами функцию замены ссылок. Если вы укажете значение base_href, все ссылки будут переданы после того, как они объединены с этим URL. Для каждой ссылки вызывается link_repl_func (ссылка). Затем эта функция возвращает новую ссылку или None, чтобы удалить атрибут или тег, содержащий ссылку. Обратите внимание, что будут переданы все ссылки, включая такие ссылки, как "#anchor" (который является чисто внутренним), и такие вещи, как "mailto: bob@example.com" (или javascript: ...).

0 голосов
/ 26 апреля 2011

Вероятно, ссылка - это просто копия реального объекта.Попробуйте заменить атрибут элемента в вашем цикле.Даже элемент может быть просто копией, но он заслуживает попытки ...

...