扒页面的时候,经常会遇到这种的需求:
目前我自己提取网页文字觉得最方便的处理是这样的
from bs4 import BeautifulSoup
html_string = "一些 HTML 字符"
soup = BeautifulSoup(html_string)
soup.text
但是
在需要保留 IMG 标签的时候就不行了,这时候我是采用正则来过滤,不过比较丑陋。。。
每次 coding 都好纠结,不知道有没有好方法,敲代码可以敲得更嗨点;)
非常感谢 BiggerLonger 提供的这个scrapy里的模块
from w3lib.html import remove_tags
# keep参数为需要保留的标签名称
remove_tags(text, keep=('img',))
1
SourceMan 2017-02-21 15:12:39 +08:00
抽象出来,不就眼不见心不烦?
|
2
HanSonJ 2017-02-21 15:16:55 +08:00
PHP: echo strip_tags('一些 HTML 字符');
别打我 逃) |
3
IanPeverell 2017-02-21 15:18:45 +08:00
可以试试 lxml ,然后用 xpath
|
5
chairuosen 2017-02-21 15:35:29 +08:00
先用正则把 img 标签找出来,替换成复杂的特殊字符文字包裹的 src 地址 text ,然后用你上文的方法替换其他标签,最后再把 img 标签转回来
|
6
bombless 2017-02-21 15:36:45 +08:00
以前做富文本编辑功能的时候做过这样的东西
用的方式是直接在 DOM 树上操作,递归解出 DOM 列表的内容 看了下 BeautifulSoup 里面也有 findChildren()这样的操作 |
7
BiggerLonger 2017-02-21 15:39:01 +08:00 1
from w3lib.html import remove_tags
remove_tags(text, which_ones=('div', 'a', ....)) scrapy 裡面的一個庫 |
8
qsnow6 OP |
9
ic2y 2017-02-21 16:12:39 +08:00
用 xpath 进行提取, xpath 可以 专门解析提取 属性。
|
10
murmur 2017-02-21 16:21:13 +08:00
想多了 难道不知道图片地址还可以写到 css 么
|
11
xieranmaya 2017-02-22 01:05:24 +08:00
jsdom 知道不
|
12
popil1987 2017-02-22 07:50:25 +08:00 via Android
用 lxml ,别用 bs4 。 bs4 只支持 css selector,而且不支持 nth-child 这种。 lxml 支持 xpath,用谷歌浏览器开发者工具可以很方便提取元素的 xpath
lxml 貌似只有排除一些 tag 的功能,没有保留一些 tag 的功能 不过可以建立个保留的 tag 名称的集合,遍历所有 node ,把未在集合中的 tag 删了就行。 当然有种情况是,你想保留 a 但不想保留 b ,那么 <b><a></a></b>这种情况得需要注意了 |