怎样删除部分字符串?

2016-06-27 19:36:05 +08:00
 omg21
<p class="p"><b><span style="font-family: 'Times New Roman'; font-size: 12pt;">一、岗位及人数</span></b><span style="font-family: 'Times New Roman'; font-size: 12pt;"><o:p></o:p></span></p><p class="p"><span style="font-family: 'Times New Roman'; font-size: 12pt;">办公室工作人员,<font face="Times New Roman">1</font><font face="微软雅黑">名;教师,</font><font face="Times New Roman">4</font><font face="微软雅黑">名。</font></span>

文本是类似这样的,我想删除 tag 里面的 class 、 style ,保留<p><span><div>并且删除掉<font>应该怎么做?
是用 BS4 还是用字符串操作?
3201 次点击
所在节点    Python
35 条回复
exoticknight
2016-06-27 22:39:45 +08:00
BS4 ,不用多想
HTML 规范, BS4 比正则简单,不易错
HTML 不规范,两个都一样糟糕
momou
2016-06-28 03:11:27 +08:00
\s\b(\S*?)[^>]*.*?
不规范的应该也可以匹配到吧
Valyrian
2016-06-28 05:23:01 +08:00
Cabana
2016-06-28 09:15:20 +08:00
对标签属性进行操作肯定用啊 bs ,对于 font 标签,把里面的内容提取出来,放到父节点中
practicer
2016-06-28 11:17:14 +08:00
倾向用正则
s = '''<p class="p">.......
.....'''

>>> pattern = re.compile('\s?(class|style)=\".*?\"\s?')
>>> result = re.sub(pattern , '', s)
>>> print result
davin
2016-06-28 11:19:50 +08:00
看到了 o:p 标签,这是从 Word 粘贴来的么?
不知道楼主是用于什么用途,把 Word 导入到 Dreamweaver ,用 Dreamweaver 自带的 「清理 Word 的 HTML 」命令就够了
yiyiwa
2016-06-28 15:56:45 +08:00
刚学啊, 看起来有点恶心,
#a 就是你的字符串

>>> print "".join([ "".join(i) for i in re.findall(r'(<[^ >]+>)|>([^<]+)',a) if "font" not in i[0]])
<b>一、岗位及人数</span></b><o:p></o:p></span></p>办公室工作人员, 1 名;教师, 4 名。</span>
yiyiwa
2016-06-28 16:19:49 +08:00
这样更好点, 正则不熟悉啊

print "".join([ "".join(i) for i in re.findall("(<(?!/font)[^ >]+>)|>([^<]+)",a)])
omg21
2016-06-28 20:01:06 +08:00
@practicer 试了一下,你的方案效率最高,能不能解释下这个正则?
'\s?(class|style)=\".*?\"\s?',或者用空格隔开,我看不懂哪个归哪个。。。
practicer
2016-06-28 20:23:58 +08:00
@omg21 先打开 http://rubular.com/,在这里测效果直观
是这样的:
class 和 style 两个属性的匹配规则相同,因此用小括号括起来,再用竖线隔开,表示“或”
隔开后:
1. \s?class=\".*?\"\s? 匹配 class 属性
2. \s?style=\".*?\"\s? 匹配 style 属性
看细节
\s 表示空格;
\s?表示空格匹配零次和一次;
class=\"表示 class="(反斜杠是转义符);
.*表示匹配任意字符零次或无限次;

?\"表示匹配从左到右第一个双引号,问号指从左到右第一个,不加问好的话会匹配到整个字符串的最后一个双引号,称为贪婪模式,反斜杠仍然是转义符;

\s?表示匹配空格零次或一次
----
补一下匹配 font 元素字符:<font.+?\/font> 中间的问号同上,匹配从左到右第一个
omg21
2016-06-28 20:36:21 +08:00
@practicer 太详细了,十分感谢,但是有的情况<p class="p">还有用单引号和不用引号的,这两种情况应该怎么代入?
omg21
2016-06-28 20:58:37 +08:00
@practicer <p class="p"><p class=‘ p ’><p class=p> 这样三种情况,另外还有双引号里套着单引号的,我是取 class=一直到>之间的内容包括>,然后再用>替换掉。
>>> pattern = re.compile('\s?(class|style)=.*?>\s?')
>>> result = re.sub(pattern , '', s)
已通过,再次感谢。
practicer
2016-06-28 21:13:00 +08:00
@omg21
s = '''
<p class="p"><p class=‘ p ’><p class=p>
'''

>>> re.compile('<.+?(?=>)', s)
这样写可以匹配 从左到右第一个 “>” 它前面的所有字符,不管它前面是啥
omg21
2016-06-28 22:31:46 +08:00
@practicer <p class="p"><td class="p">如何在删除<p>里的 class 的同时保留下来<td class="p">?
practicer
2016-06-28 23:04:09 +08:00
(?<=<p).+?(?=>)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288671

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX