【问题标题】:lxml -- how to change img src to absolute linklxml -- 如何将 img src 更改为绝对链接
【发布时间】:2014-11-27 20:20:27
【问题描述】:

使用lxml,如何用绝对链接全局替换所有src属性?

【问题讨论】:

    标签: python html python-2.7 lxml absolute-path


    【解决方案1】:

    这是一个示例代码,它也涵盖了<a href>

    from lxml import etree, html
    import urlparse
    
    def fix_links(content, absolute_prefix):
        """
        Rewrite relative links to be absolute links based on certain URL.
    
        @param content: HTML snippet as a string
        """
    
        if type(content) == str:
            content = content.decode("utf-8")
    
        parser = etree.HTMLParser()
    
        content = content.strip()
    
        tree  = html.fragment_fromstring(content, create_parent=True)
    
        def join(base, url):
            """
            Join relative URL
            """
            if not (url.startswith("/") or "://" in url):
                return urlparse.urljoin(base, url)
            else:
                # Already absolute
                return url
    
        for node in tree.xpath('//*[@src]'):
            url = node.get('src')
            url = join(absolute_prefix, url)
            node.set('src', url)
        for node in tree.xpath('//*[@href]'):
            href = node.get('href')
            url = join(absolute_prefix, href)
            node.set('href', url)
    
        data =  etree.tostring(tree, pretty_print=False, encoding="utf-8")
    
        return data
    

    The full story is available in Plone developer documentation

    【讨论】:

    • parser = etree.HTMLParser() 是干什么用的?
    • 不确定我是否理解了这个问题,但HTMLParser 是一个类,它构造了它的一个实例。
    【解决方案2】:

    在测试了 Mikko Ohtamaa 的答案后,这里有一些注释。 它适用于许多标签,并且使用 lxm,有不同的情况,例如 background-image:url(xxx)。所以我只是使用正则表达式来代替。 这是解决方案,

    content = re.sub('(?P<left>("|\'))\s*(?P<url>(\w|\.)+(/.+?)+)\s*(?P<right>("|\'))',
                         '\g<left>' + url[:url.rfind('/')] + '/\g<url>\g<right>', content)
    content = re.sub('(?P<left>("|\'))\s*(?P<url>(/.+?)+)\s*(?P<right>("|\'))',
                         '\g<left>' + url[:url.find('/', 8)] + '\g<url>\g<right>', content)
    

    【讨论】:

      【解决方案3】:

      我不确定这是什么时候添加的,但是从lxml.fromstring() 创建的文档现在有一个名为make_links_absolute 的方法。来自documentation

      make_links_absolute(base_href, resolve_base_href=True):

      这使得文档中的所有链接都是绝对的,假设 base_href 是文档的 URL。因此,如果您通过 base_href="http://localhost/foo/bar.html" 并且有一个指向 baz.html 的链接将被重写为 http://localhost/foo/baz.html

      如果 resolve_base_href 为真,那么任何标签都会被考虑在内(只需调用 self.resolve_base_href())。

      【讨论】:

      • 看来要先用resolve_base_href处理base标签,再调用make_links_absolute
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2011-08-04
      • 2017-06-23
      • 1970-01-01
      相关资源
      最近更新 更多