您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

lxml python加载没有标题和正文的html字符串,并在目标元素周围添加元素

5b51 2022/1/14 8:20:25 python 字数 5367 阅读 494 来源 www.jb51.cc/python

我试图使用lxml从字符串中读取html然后尝试查找所有img标签,更新图像src的属性并在找到的每个图像周围添加超链接 所以这, <img src="old-value" /> 将是这样 <a href=""><img src="new-value" /></a> 我面临的问题是两个,首先是使用etree.HTML加载html字符串,由于某种原因,它将html标签和body标签添加到html本身

概述

所以这,

<img src="old-value" />

将是这样

<a href=""><img src="new-value" /></a>

我面临的问题是两个,首先是使用etree.HTML加载html字符串,由于某种原因,它将html标签和body标签添加到html本身.有没有办法加载它而不会自动导致这种情况发生?

一个问题无法解决,我如何在图像标签周围添加链接元素,我尝试了下面但它会在img标签添加链接元素

tree = etree.HTML(self.content)
imgs = tree.xpath('.//img')
thm = "new-value"
for img in imgs:
     img.set('src',thm)
     a = etree.Element('a',href="#")
     img.insert(0,a)

有人可以提出建议吗?

更新:

我刚刚尝试了@Alko提供的方法,并且运行良好,但是我使用的内容类型存在问题.

img标记位于p标记内,例如下面的示例

<html><body><p><img src="/public_media/cache/66/ed/66edd1c01e3027ba18bef9244ca8e8b4.jpg?id=31"/>jshjksh skjhs jksh skjhsj ksh jkshs kjhs kjsh sjkhs khs ksh skh skh skjh skjh skjh ksjh ksh skhs kjsh skjh skhs khs kjsh skjh skjhs kshk sjh skjhs kjsh skjh skjh ksj ksjh jsk hskjh s</p><p>jshjksh skjhs jksh skjhsj ksh jkshs kjhs kjsh sjkhs khs ksh skh skh skjh&#13;
 skjh skjh ksjh ksh skhs kjsh skjh skhs khs kjsh skjh skjhs kshk sjh &#13;
skjhs kjsh skjh skjh ksj ksjh jsk hskjh s</p></body></html>

当我运行给出的解决方案时发生了什么,在段落结束后添加一个标签.

imgs = tree.xpath('.//img')
thm = "new-value"
for img in imgs:
    img.set('src',thm)
    a = etree.Element('a',href="#")
    img.addprevIoUs(a)
    a.insert(0,img)

这将导致

>>> etree.tostring(tree)
'<html><body><a href="#"><img src="new-value"/></a></body></html>'

此外,lxml.html.fragment_fromstring可能很有用,但您必须提供更多样化的示例,因为在单独的图像元素的情况下,您的xpath将无法找到它.

见以下演示:

>>> import lxml.html
>>> img = lxml.html.fragment_fromstring('<img src="old-value" />')
>>> thm = "new-value"
>>> img.set('src',thm)
>>> a = etree.Element('a',href="#")
>>> a.insert(0,img)
>>> lxml.html.etree.tostring(a)
'<a href="#"><img src="new-value"/></a>'

更新

对于img标记有尾部的情况,您可以重新分配它以创建标记

>>> s = '<html><body><p><img src="old_value"/>some text</p></body></html>'
>>> tree = etree.HTML(s)
>>> imgs = tree.xpath('.//img')
>>> thm = "new-value"
>>> for img in imgs:
...     img.set('src',thm)
...     a = etree.Element('a',href="#")
...     img.addprevIoUs(a)
...     a.insert(0,img)
...     a.tail = img.tail
...     img.tail = ''
...
>>> etree.tostring(tree)
'<html><body><p><a href="#"><img src="new-value"/></a>some text</p></body></html>'

总结

以上是编程之家为你收集整理的lxml python加载没有标题和正文的html字符串,并在目标元素周围添加元素全部内容,希望文章能够帮你解决lxml python加载没有标题和正文的html字符串,并在目标元素周围添加元素所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶