如何使用lxml和iterlinks替换链接

问题描述 投票:6回答:4

我是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提供了有关每个链接的更多信息,所以我更愿意使用它。

提前感谢。

python lxml
4个回答
6
投票

而不是仅将新的(字符串)值分配给变量名称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
投票

lxml提供了rewrite_links方法(或将要解析的文本传递到文档中的功能),以提供更改文档中所有链接的方法:

。rewrite_links(link_repl_func,resolve_base_href = True,base_href = None):这将使用给定的链接替换功能重写文档中的所有链接。如果您提供base_href值,则所有链接都与此URL结合后将被传入。对于每个链接,都会调用link_repl_func(link)。然后,该函数返回新链接,或者返回None以删除包含链接的属性或标记。请注意,所有链接都将传入,包括“ #anchor”(纯粹是内部)之类的链接,以及“ mailto:[email protected]”(或javascript:...)之类的内容。


0
投票

可能链接只是实际对象的副本。尝试替换循环中元素的属性。甚至元素也可以只是一个副本,但值得一试...


0
投票

这里是带有rewrite_links的工作代码:

from lxml.html import fromstring, tostring

e = fromstring("<html><body><a href='http://localhost'>hello</body></html>")

def my_rewriter(link):
  return "http://newlink.com"

e.rewrite_links(my_rewriter)
print(tostring(e))

输出:

    b'<html><body><a href="http://newlink.com">hello</a></body></html>'
© www.soinside.com 2019 - 2024. All rights reserved.