xpath 一键去除前后空白、回车、换行
使用xpath方式,打印结果,经常出现大量换行、空格等情况
示例如下:
from lxml import etree
# data = etree.parse('./素材/示例网站.html')
parser = etree.HTMLParser(encoding="utf-8") # 出现读取错误时,需要加入parser参数
data = etree.parse('./素材/示例网站.html', parser=parser)
chuban = data.xpath('//p[@class="color-gray"]/text()')
print(chuban)
# 打印结果,出现大量换行、空格等情况
['\r\n [意] 埃莱娜·费兰特 / 人民文学出版社 / 2017-10\r\n ',
'\r\n [美] 彼得·布雷瓦 / 后浪丨文化发展出版社 / 2017-11\r\n ',
'\r\n 刘震云 / 长江文艺出版社 / 2017-11-1\r\n ',
'\r\n [美] 约翰·约瑟夫·亚当斯 编 / 新星出版社 / 2017-10\r\n ',
'\r\n [英] 约翰·福尔斯 / 百花文艺出版社 / 2017-10\r\n ',
'\r\n [俄] 列夫·托尔斯泰 / 东方出版社 / 2017-10\r\n ',
'\r\n [美] 芭芭拉·金索沃 / 南海出版公司 / 2017-10\r\n ',
'\r\n [英] 格雷厄姆·格林 / 江苏凤凰文艺出版社 / 2017-11\r\n ',
'\r\n [加] 艾丽丝·门罗 / 理想国丨广西师范大学出版社 / 2017-11-1\r\n ',
'\r\n 木心 / 理想国 | 广西师范大学出版社 / 2017-10\r\n ',
'\r\n [日] 岩井俊二 / 浙江文艺出版社 / 2017-10\r\n ',
'\r\n [英] 萨拉·沃特斯 / 世纪文景/上海人民出版社 / 2017-10\r\n ',
'\r\n [美] 菲利普·迪克 / 译林出版社 / 2017-10\r\n ',
'\r\n [日] 东野圭吾 / 南海出版公司 / 2017-11\r\n ',
'\r\n 程波 / 张乐山 / 沐来文化/鹭江出版社 / 2017-9\r\n ',
'\r\n [日] 涩泽龙彦 / 广西师范大学出版社 / 2017-9\r\n ']
处理方法1:.strip()
(保留列表)
使用一个推导式循环,直接替换掉原代码,可实现一步解决。(这里aaa可以随意取名,不冲突即可)
chuban = data.xpath('//p[@class="color-gray"]/text()') # 大量换行、空格的原代码
final_chuban = [aaa.strip() for aaa in chuban]
print(final_chuban)
['[意] 埃莱娜·费兰特 / 人民文学出版社 / 2017-10', '[美] 彼得·布雷瓦 / 后浪丨文化发展出版社 / 2017-11',
'刘震云 / 长江文艺出版社 / 2017-11-1', '[美] 约翰·约瑟夫·亚当斯 编 / 新星出版社 / 2017-10',
'[英] 约翰·福尔斯 / 百花文艺出版社 / 2017-10', '[俄] 列夫·托尔斯泰 / 东方出版社 / 2017-10',
'[美] 芭芭拉·金索沃 / 南海出版公司 / 2017-10', '[英] 格雷厄姆·格林 / 江苏凤凰文艺出版社 / 2017-11',
'[加] 艾丽丝·门罗 / 理想国丨广西师范大学出版社 / 2017-11-1', '木心 / 理想国 | 广西师范大学出版社 / 2017-10',
'[日] 岩井俊二 / 浙江文艺出版社 / 2017-10', '[英] 萨拉·沃特斯 / 世纪文景/上海人民出版社 / 2017-10',
'[美] 菲利普·迪克 / 译林出版社 / 2017-10', '[日] 东野圭吾 / 南海出版公司 / 2017-11',
'[美] 米奇·阿尔博姆 / 南海出版公司 / 2017-11', '[英] 约翰·克利兰 / 江苏凤凰文艺出版社 / 2017-9',
'[美] 菲利普·迪克 / 译林出版社 / 2017-10', '[意大利] 亚历山德罗·巴里科 / 浦睿文化·湖南文艺出版社 / 2017-10',']
处理方法2:re.sub('\s', '', ...)
(保留列表)
final_chuban = [re.sub('\s', '', ''.join(aaa)) for aaa in chuban]
print(final_chuban)
['[意]埃莱娜·费兰特/人民文学出版社/2017-10', '[美]彼得·布雷瓦/后浪丨文化发展出版社/2017-11',
'刘震云/长江文艺出版社/2017-11-1', '[美]约翰·约瑟夫·亚当斯编/新星出版社/2017-10',
'[英]约翰·福尔斯/百花文艺出版社/2017-10', '[俄]列夫·托尔斯泰/东方出版社/2017-10',
'[美]芭芭拉·金索沃/南海出版公司/2017-10', '[英]格雷厄姆·格林/江苏凤凰文艺出版社/2017-11',
'[加]艾丽丝·门罗/理想国丨广西师范大学出版社/2017-11-1', '木心/理想国|广西师范大学出版社/2017-10',
'[日]岩井俊二/浙江文艺出版社/2017-10', '[英]萨拉·沃特斯/世纪文景/上海人民出版社/2017-10',
'[美]菲利普·迪克/译林出版社/2017-10', '[日]东野圭吾/南海出版公司/2017-11',
'[美]米奇·阿尔博姆/南海出版公司/2017-11', '[英]约翰·克利兰/江苏凤凰文艺出版社/2017-9',
'[美]菲利普·迪克/译林出版社/2017-10', '[意大利]亚历山德罗·巴里科/浦睿文化·湖南文艺出版社/2017-10',
'[法]瓦西利斯·亚历克萨基斯/人民文学出版社/2017-10', '[美]威廉·福克纳/北京燕山出版社/2017-11']
-
''.join(...)
: 将从XPath表达式提取的文本内容组合成一个字符串。''.join()
是字符串的连接方法,将列表或可迭代对象中的字符串元素连接成一个字符串。 -
re.sub('\s', '', ...)
: 这里使用了正则表达式的re.sub
函数,用于替换字符串中的匹配项。\s
表示匹配任何空白字符,包括空格、制表符等。第二个参数是替换后的内容,这里是空字符串。因此,这一步是将文本中的所有空白字符删除。
当然你也可以拆散列表
处理方法3:去掉文字前后的空白,保留中间的空格内容
for chu in chuban:
print(chu.strip())
[意] 埃莱娜·费兰特 / 人民文学出版社 / 2017-10
[美] 彼得·布雷瓦 / 后浪丨文化发展出版社 / 2017-11
刘震云 / 长江文艺出版社 / 2017-11-1
处理方法4:去掉文字中所有空白字符,包括空格、制表符等
for chu in chuban:
d = re.sub('\s', '', ''.join(chu))
print(d)
[意]埃莱娜·费兰特/人民文学出版社/2017-10
[美]彼得·布雷瓦/后浪丨文化发展出版社/2017-11
刘震云/长江文艺出版社/2017-11-1