gpt4 book ai didi

python-3.x - 标签内的美丽汤标签

转载 作者:行者123 更新时间:2023-12-03 23:10:59 24 4
gpt4 key购买 nike

我正在尝试添加一个新链接作为无序列表元素。

但是我不能在另一个带有 Beautiful Soup 的标签中添加标签。

with open('index.html') as fp:
soup = BeautifulSoup(fp, 'html.parser')

a = soup.select_one("id[class=pr]")
ntag1 = soup.new_tag("a", href="hm/test")
ntag1.string = 'TEST'
... (part with problem)
a.insert_after(ntag2)

ntag1 必须留在里面 "<li>" ,所以我试过了
   ntag2 = ntag1.new_tag('li')  
TypeError: 'NoneType' object is not callable

带包装()
 ntag2 = ntag1.wrap('li')
ValueError: Cannot replace one element with another when theelement to be replaced is not part of a tree.

原始 HTML
<id class="pr">
</id>
<li>
<a href="pr/protocol">
protocol
</a>

理想的 html 输出
<id class="pr">
</id>
<li>
<a href="hm/test">
TEST
</a>
</li>
<li>
<a href="pr/protocol">
protocol
</a>
</li>

最佳答案

为什么您会收到 NoneType错误是因为 ntag2 = ntag1.new_tag('li')正在尝试调用方法 Tag 对象没有。
Cannot replace one element with another when theelement是因为您创建了一个与树没有关联的标签,如果您尝试包装,它没有必须具有的父级。

创建父 li 并只附加 anchor 子 child 会更有意义:

html = """<div class="pr">
</div>
<li>
<a href="pr/protocol">
protocol
</a>
</li>"""

soup = BeautifulSoup(html, "lxml")

a = soup.select_one("div[class=pr]")

# Li parent
parent = soup.new_tag("li", class_="parent")
# Child anchor
child = soup.new_tag("a", href="hm/test", class_="child")
child.string = 'TEST'
# Append child to parent
parent.append(child)
# Insert parent
a.insert_after(parent)
print(soup.prettify())

这会给你你想要的输出栏 html 无效。

如果你有一个实际的 ul 你想在某个元素之后到达,即
html = """<div class="pr">
</div>
<ul>
<li>
<a href="pr/protocol">
protocol
</a>
</li>
</ul>
"""

将 a 的 css 选择器设置为 div[class=pr] + ul"并插入父级:
a = soup.select_one("div[class=pr] + ul")
.....
a.insert(0, parent)
print(soup.prettify())

这会给你:
<html>
<body>
<div class="pr">
</div>
<ul>
<li class_="parent">
<a class_="child" href="hm/test">
TEST
</a>
</li>
<li>
<a href="pr/protocol">
protocol
</a>
</li>
</ul>
</body>
</html>

如果你想包装一个现有的标签:
from bs4 import BeautifulSoup, Tag

html = """<div class="pr">
</div>
<a href="pr/protocol">
protocol
"""

soup = BeautifulSoup(html, "lxml")

a = soup.select_one("div[class=pr] + a")
a.wrap(Tag(name="div"))
print(soup.prettify())

这将包装现有的 anchor :
<html>
<body>
<div class="pr">
</div>
<div>
<a href="pr/protocol">
protocol
</a>
</div>
</body>
</html>

关于python-3.x - 标签内的美丽汤标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672181/

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