gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:22:37 25 4
gpt4 key购买 nike

我正在尝试使用 lxml 从字符串中读取 html,然后尝试查找所有 img 标签,更新图像 src 的属性并在找到的每个图像周围添加超链接

所以这个,

<img src="old-value" />

会是这个

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

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

另一个问题无法解决,我如何在图像标签周围添加超链接元素,我尝试了下面但它会在 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>

当我运行给定的解决方案时发生了什么,在段落结束后添加了结束标记。

最佳答案

您可以在插入之前使用addprevious:

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 标签有尾部的情况,您可以将其重新分配给创建的 a 标签:

>>> 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>'

关于python - lxml python加载没有标题和正文的html字符串并在目标元素周围添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com