怎样更优雅的过滤 HTML 标签?

2017 年 2 月 21 日
 qsnow6

扒页面的时候,经常会遇到这种的需求:

目前我自己提取网页文字觉得最方便的处理是这样的

    from bs4 import BeautifulSoup
    html_string = "一些 HTML 字符" 
    soup = BeautifulSoup(html_string)
    soup.text

但是

在需要保留 IMG 标签的时候就不行了,这时候我是采用正则来过滤,不过比较丑陋。。。

每次 coding 都好纠结,不知道有没有好方法,敲代码可以敲得更嗨点;)

3641 次点击
所在节点    Python
12 条回复
SourceMan
2017 年 2 月 21 日
抽象出来,不就眼不见心不烦?
HanSonJ
2017 年 2 月 21 日
PHP: echo strip_tags('一些 HTML 字符');

别打我 逃)
IanPeverell
2017 年 2 月 21 日
可以试试 lxml ,然后用 xpath
qsnow6
2017 年 2 月 21 日
@SourceMan 想看有没有现成的,造轮子水平不高。。
chairuosen
2017 年 2 月 21 日
先用正则把 img 标签找出来,替换成复杂的特殊字符文字包裹的 src 地址 text ,然后用你上文的方法替换其他标签,最后再把 img 标签转回来
bombless
2017 年 2 月 21 日
以前做富文本编辑功能的时候做过这样的东西
用的方式是直接在 DOM 树上操作,递归解出 DOM 列表的内容
看了下 BeautifulSoup 里面也有 findChildren()这样的操作
BiggerLonger
2017 年 2 月 21 日
from w3lib.html import remove_tags
remove_tags(text, which_ones=('div', 'a', ....))
scrapy 裡面的一個庫
qsnow6
2017 年 2 月 21 日
@BiggerLonger 这个好!!!
现在就是在用 scrapy 写爬虫

这样就解决了!!

````
remove_tags(text, keep=('img'))
````
ic2y
2017 年 2 月 21 日
用 xpath 进行提取, xpath 可以 专门解析提取 属性。
murmur
2017 年 2 月 21 日
想多了 难道不知道图片地址还可以写到 css 么
xieranmaya
2017 年 2 月 22 日
jsdom 知道不
popil1987
2017 年 2 月 22 日
用 lxml ,别用 bs4 。 bs4 只支持 css selector,而且不支持 nth-child 这种。 lxml 支持 xpath,用谷歌浏览器开发者工具可以很方便提取元素的 xpath
lxml 貌似只有排除一些 tag 的功能,没有保留一些 tag 的功能
不过可以建立个保留的 tag 名称的集合,遍历所有 node ,把未在集合中的 tag 删了就行。
当然有种情况是,你想保留 a 但不想保留 b ,那么
<b><a></a></b>这种情况得需要注意了

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

https://study.congcong.us/t/342064

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

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

© 2021 V2EX