Python 靓汤罐';t用括号编辑电话号码

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<

我正在尝试从html文件中编辑电话号码信息。。。虽然我可以很容易地识别所有的电话号码,但我不明白为什么我不能替换带有括号的电话号码。样本如下:

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>