Python 靓汤罐';t用括号编辑电话号码
我正在尝试从html文件中编辑电话号码信息。。。虽然我可以很容易地识别所有的电话号码,但我不明白为什么我不能替换带有括号的电话号码。样本如下:Python 靓汤罐';t用括号编辑电话号码,python,html,beautifulsoup,phone-number,redaction,Python,Html,Beautifulsoup,Phone Number,Redaction,我正在尝试从html文件中编辑电话号码信息。。。虽然我可以很容易地识别所有的电话号码,但我不明白为什么我不能替换带有括号的电话号码。样本如下: import re from bs4 import BeautifulSoup text = '''<html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <title>Big Title<
import re
from bs4 import BeautifulSoup
text = '''<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Big Title</title>
<style type="text/css">
.parsed {font-size: 75%; color: #474747;}
</style>
</head>
<body>
<div class="parsed">
<h1>Redacted Redacted</h1>
<h2> Contact Info</h2>
<ul>
<li>Position Title: My Fake Title</li>
<li>Email: Redacted@gmail.com</li>
<li>Phones: (555) 555-5555</li>
</ul><b>Category:</b> <ul><li>Title 2 </li><li>Fake Info</li></ul>
City, MO 11111 | (555) 111-1111 | myemail@gmail.com
Some Category / Some Name: 555-222-2222 | Record Number#:
</html>'''
soup = BeautifulSoup(text, 'html.parser')
def find_phone_numbers(text):
phones = re.findall(r"((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})", text)
return phones
phones = find_phone_numbers(str(soup))
print(phones)
for i in phones:
target = soup.find_all(text=re.compile(i, re.I))
try:
for v in target:
v.replace_with(v.replace(i,'(XXX) XXX-XXXX'))
except TypeError:
pass;
print(soup)
重新导入
从bs4导入BeautifulSoup
文本='''
大标题
.parsed{字体大小:75%;颜色:#474747;}
编辑
联系方式
- 职位名称:我的假头衔
- 电邮:Redacted@gmail.com
- 电话:(555)555-5555
类别:- 标题2
- 虚假信息
密苏里州城市11111 |(555)111-1111 |myemail@gmail.com
某些类别/某些名称:555-222-2222 |记录编号#:
'''
soup=BeautifulSoup(文本“html.parser”)
def查找电话号码(文本):
phones=re.findall(r“((?:\d{3}\(\d{3}\))?(?:\s{124;-}\)?\ d{3}(?:\s{124;-}\)\ d{4})”,文本)
回电
电话=查找电话号码(str(soup))
打印(电话)
对于手机中的i:
target=soup.find_all(text=re.compile(i,re.i))
尝试:
对于目标中的v:
v、 将_替换为(v.替换(i),(XXX)XXX-XXXX'))
除类型错误外:
通过;
印花(汤)
以下是我运行上述操作的结果:
['(555) 555-5555', '(555) 111-1111', '555-222-2222']
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Big Title</title>
<style type="text/css">
.parsed {font-size: 75%; color: #474747;}
</style>
</head>
<body>
<div class="parsed">
<h1>Redacted Redacted</h1>
<h2> Contact Info</h2>
<ul>
<li>Position Title: My Fake Title</li>
<li>Email: Redacted@gmail.com</li>
<li>Phones: (555) 555-5555</li>
</ul><b>Category:</b> <ul><li>Title 2 </li><li>Fake Info</li></ul>
City, MO 11111 | (555) 111-1111 | myemail@gmail.com
Some Category / Some Name: (XXX) XXX-XXXX | Record Number#:
</div></body></html>
['(555)555-5555','(555)111-1111','555-222-2222']
大标题
.parsed{字体大小:75%;颜色:#474747;}
编辑
联系方式
- 职位名称:我的假头衔
- 电邮:Redacted@gmail.com
- 电话:(555)555-5555
类别:- 标题2
- 虚假信息
密苏里州城市11111 |(555)111-1111 |myemail@gmail.com
某些类别/某些名称:(XXX)XXX-XXXX |记录编号#:
方法有轻微变化。获取所有li
标签,然后对于每个标签,如果存在电话号码,则用您的掩码替换电话号码。我使用了一个临时变量(temp_text
),只是为了让代码更具可读性
all_li=soup.find_all('li')
for li in all_li:
temp_text=re.sub(r"((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})", '(XXX) XXX-XXXX', li.text)
if temp_text:
li.replace_with(temp_text)
打印(汤)
输出:
您可以使用
.find_all(text=True)
从HTML soup中获取所有文本内容,然后将其替换为re.sub
(这样,您可以保留所有标记,包括
):
印刷品:
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Big Title</title>
<style type="text/css">
.parsed {font-size: 75%; color: #474747;}
</style>
</head>
<body>
<div class="parsed">
<h1>Redacted Redacted</h1>
<h2> Contact Info</h2>
<ul>
<li>Position Title: My Fake Title</li>
<li>Email: Redacted@gmail.com</li>
<li>Phones: (XXX) XXX-XXXX</li>
</ul><b>Category:</b> <ul><li>Title 2 </li><li>Fake Info</li></ul>
City, MO 11111 | (XXX) XXX-XXXX | myemail@gmail.com
Some Category / Some Name: (XXX) XXX-XXXX | Record Number#:
</div></body></html>
大标题
.parsed{字体大小:75%;颜色:#474747;}
编辑
联系方式
- 职位名称:我的假头衔
- 电邮:Redacted@gmail.com
- 电话:(XXX)XXX-XXXX
类别:- 标题2
- 虚假信息
密苏里州城市11111 |(XXX)XXX-XXXX |myemail@gmail.com
某些类别/某些名称:(XXX)XXX-XXXX |记录编号#:
我为另一个建议添加了标签,因为它涵盖了整个文档,但我认为这在我追踪单个标签时会很有用-感谢您的帮助
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Big Title</title>
<style type="text/css">
.parsed {font-size: 75%; color: #474747;}
</style>
</head>
<body>
<div class="parsed">
<h1>Redacted Redacted</h1>
<h2> Contact Info</h2>
<ul>
<li>Position Title: My Fake Title</li>
<li>Email: Redacted@gmail.com</li>
<li>Phones: (XXX) XXX-XXXX</li>
</ul><b>Category:</b> <ul><li>Title 2 </li><li>Fake Info</li></ul>
City, MO 11111 | (XXX) XXX-XXXX | myemail@gmail.com
Some Category / Some Name: (XXX) XXX-XXXX | Record Number#:
</div></body></html>