在HTML中查找和替换字符串

时间:2015-07-04 11:33:50

标签: python html python-2.7 beautifulsoup

从此HTML代码:

<p class="description" dir="ltr">Name is a fine man. <br></p>

我正在寻找替换&#34;姓名&#34;使用以下代码:

target = soup.find_all(text="Name")
for v in target:
    v.replace_with('Id')

我想要的输出是:

<p class="description" dir="ltr">Id is a fine man. <br></p>

当我:

print target
[]

为什么它没有找到&#34;名称&#34;?

谢谢!

2 个答案:

答案 0 :(得分:6)

HTML中的文本节点包含除"Name"之外的其他一些文本。在这种情况下,您需要放宽搜索条件以使用包含而不是完全匹配,例如,使用正则表达式。然后,您可以使用原始文本替换匹配的文本节点,但"Name"部分应使用简单"Id"方法替换为string.replace(),例如:

from bs4 import BeautifulSoup
import re

html = """<p class="description" dir="ltr">Name is a fine man. <br></p>"""
soup = BeautifulSoup(html)
target = soup.find_all(text=re.compile(r'Name'))
for v in target:
    v.replace_with(v.replace('Name','Id'))
print soup

输出:

<html><body><p class="description" dir="ltr">Id is a fine man. <br/></p></body></html>

答案 1 :(得分:1)

它返回一个空列表,因为搜索这样的文本必须与标记中的整个文本匹配,所以请改用正则表达式。

来自官方文档:BeautifulSoup - Search text

  

text是一个允许您搜索NavigableString对象的参数   而不是标签。它的值可以是字符串,正则表达式,a   列表或字典,True或None,或者是一个可调用的   NavigableString对象作为其参数:

soup.findAll(text="one")
# [u'one']
soup.findAll(t ext=re.compile("paragraph"))
# [u'This is paragraph ', u'This is paragraph ']
soup.findAll(text=lambda(x): len(x) < 12)
# [u'Page title', u'one', u'.', u'two', u'.']

P.S。:已经讨论过的答案是herehere