gpt4 book ai didi

python - 如何使 BeautifulSoup 'replace_with' 属性与 'unicode' 对象一起使用?

转载 作者:行者123 更新时间:2023-11-30 21:58:09 25 4
gpt4 key购买 nike

这是我的html:

<html>
<body>
<h2>Pizza</h2>
<p>This is some random paragraph without child tags.</p>
<p>Delicious homebaked pizza.<br><em></em>$8.99 pp</em></p>
<h2>Eggplant Parmesan</h2>
<p>Try the authentic <i>Italian flavor</i> of baked aubergine.<br><em>$6.99 pp</em></p>
<h2>Italian Ice Cream</h2>
<p>Our dessert specialty.<br><em>$3.99 pp</em></p>
</body>
</html>

使用 BeautifulSoup,我想抓取为 h2p 标签显示的文本,将它们替换为树中的前缀版本,然后打印它们出现在屏幕上。对于 h2 标签,效果很好:

from bs4 import BeautifulSoup

with open("/var/www/html/Test/index.html", "r") as f:
soup = BeautifulSoup(f, "lxml")

f = open("/var/www/html/Test/I18N_index.html", "w+")

for h2 in soup.find_all('h2'):
i18n_string = "I18N_"+h2.string
h2.string.replace_with(i18n_string)
print(h2.string)

f.write(str(soup))


###Output:##############################################
# $ python ./test.py
# I18N_Pizza
# I18N_Eggplant Parmesan
# I18N_Italian Ice Cream
########################################################

在我的 I18N_index.html 中,所有 3 个字符串都正确显示,并带有“I18N_”前缀。

但是,我的 p 标记包含子标记,对于这些子标记,返回类型为“None”。结果,串联不再起作用:

    for p in soup.find_all('p'):
i18n_string = "I18N_"+p.string
p.string.replace_with(i18n_string)
print(p.string)

f.write(str(soup))

###Output:##################################################
# $ python ./test.py
# I18N_Pizza
# I18N_Eggplant Parmesan
# I18N_Italian Ice Cream
# I18N_This is some random paragraph without child tags.
# Traceback (most recent call last):
# File "./test.py", line 15, in <module>
# i18n_string = "I18N_"+p.string
# TypeError: cannot concatenate 'str' and 'NoneType' objects
############################################################

来自this thread我了解了 join 函数。它让我可以进行串联并在屏幕上打印出结果字符串,但不能在汤树中进行替换:

for p in soup.find_all('p'):
joined = ''.join(p.strings)
i18n_string = "I18N_"+joined
#joined.replace_with(i18n_string)
print (i18n_string)

###Output with 'joined.replace_with(i18n_string)' DISABLED:###
# I18N_Pizza
# I18N_Eggplant Parmesan
# I18N_Italian Ice Cream
# I18N_This is some random paragraph without child tags.
# I18N_Delicious homebaked pizza.$8.99 pp
# I18N_Try the authentic Italian flavor of baked aubergine.$6.99 pp
# I18N_Our dessert specialty$3.99 pp
############################################################

###Output with 'joined.replace_with(i18n_string)' ENABLED:#####
# I18N_Pizza
# I18N_Eggplant Parmesan
# I18N_Italian Ice Cream
# Traceback (most recent call last):
# File "./test.py", line 41, in <module>
# joined.replace_with(i18n_string)
# AttributeError: 'unicode' object has no attribute 'replace_with'
############################################################

在该线程中,提到了另一个基于 isinstance 的解决方案,但我无法使其工作。

如果我理解正确的话, join 函数会连接字符串,但返回一个“unicode”对象,而不是字符串对象,这就是“replace_with”属性不起作用的原因。我该如何解决这个问题?非常感谢任何帮助。

最佳答案

replace_with() 方法不起作用不是因为 joined 是 unicode 对象,而是因为它是 bs4 对象特有的方法。看到这个:BeautifulSoup-replace_with

顺便说一下,join() 方法返回一个 str 请参阅:python3-join

现在为了给您一个解决方案,我只需删除 p 标记后面的 string 即可:

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
soup = BeautifulSoup(f, "lxml")

f = open("I18N_index.html", "w+")

for h2 in soup.find_all('h2'):
i18n_string = "I18N_"+h2.string
h2.string.replace_with(i18n_string)
print(h2.string)

for p in soup.find_all('p'):
joined = ''.join(p.strings)
i18n_string = "I18N_"+joined
p.replace_with(i18n_string)
print (i18n_string)


f.write(str(soup))

输出:

I18N_Pizza
I18N_茄子巴马干酪
I18N_意大利冰淇淋
I18N_This 是一些没有子标签的随机段落。
I18N_美味的自制披萨。每份 8.99 美元
I18N_尝试正宗意大利 flavor 的烤茄子。每人 6.99 美元
I18N_我们的特色甜点。每人 3.99 美元

关于python - 如何使 BeautifulSoup 'replace_with' 属性与 'unicode' 对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55023173/

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