我是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提供了有关每个链接的更多信息,所以我更愿意使用它。
提前感谢。
而不是仅将新的(字符串)值分配给变量名称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()
。
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:...)之类的内容。
可能链接只是实际对象的副本。尝试替换循环中元素的属性。甚至元素也可以只是一个副本,但值得一试...
这里是带有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>'