小笔记-简单但够用系列_xpath 定位输出对应格式文本踩坑记录

实现目标

爬取网页源码后,使用xpath 定位多标签的文本并进行输出。
xml 例子如下,文本在不同标签下,且具有对应排版格式。

...
<div class="article-text"> 
<div class="article-text"> 
                        
	
	<p>
		1、晚上做的菜饭,隔壁萌娃一看说:伯伯你做的菜饭一看就不好吃。</p><p></p>
我说:可好吃了。<p></p>
他说:我不信,除非你让尝一碗,我才知道。<p></p>
一小碗吃了,我问:好吃吗?<p></p>
他说:还行,要想我夸你做的好吃,你得再给我来一碗。<p></p>
我。。。
	<p></p>
	<p>
		2、小的时候喜欢逮蜜蜂,每当逮着一个,就在蜜蜂肚子上扎个洞,就使劲吸,你别说,肚子里的蜂蜜,还真好吃!</p><p></p>
等以后,慢慢长大上了,上学后,老师告诉我,那是绿豆蝇。。。
	<p></p>
...

在网页中的输出如下
在这里插入图片描述

问题

//div[@class=‘article-text’]/text() 无法获取子标签中的内容

使用 /text() 定位获取文本,会漏掉 p 标签中的分标题内容,但分开获取信息容易造成混乱。

代码
joker_text1 = res_html.xpath("//div[@class='article-text']/text()")
print(joker_text1)

输出结果
[' \n                        \r\n\t\r\n\t', '\r\n我说:可好吃了。', '\r\n他说:我不信,除非你让尝一碗,我才知道。', '\r\n一小碗吃了,我问:好吃吗?', '\r\n他说:还行,要想我夸你做的好吃,你得再给我来一碗。', '\r\n我。。。\r\n\t\r\n\t', '\r\n等以后,慢慢长大上了,上学后,老师告诉我,那是绿豆蝇。。。\r\n\t\r\n\t', '\r\n我说你那么多好朋友两个怎么够?', '\r\n儿子:有人送给我我就回赠一个,再把他给我的送给别人,两个我觉得都多了。\r\n\t\r\n\t', '\r\n大儿委屈:他踢我,没瞄准,踢板凳上了。。。\r\n\t\r\n\t', '\r\n我说他你长大就长大吧,你的JJ长大了有什么用?', '\r\n他说JJ长大了就会尿的多!', '\r\n我问他尿的多就好吗?', '\r\n他说尿的多就可以浇死更多的蚂蚁。。。', '\r\n孩子,蚂蚁是跟你有仇吗?\r\n\t\r\n\r\n                    ']

//div[@class=‘article-text’]//text() 可获取包括子标签在内的文本内容,但输出存在格式问题

使用 //text() 可以获取到包括子标签在内的所有文本内容,但是,对于上述例子中的具有特殊格式的文本内容,其输出会存在问题,无法达到如同在网页中效果输出。

代码
joker_text = res_html.xpath("//div[@class='article-text']//text()")
print(joker_text)
for i in joker_text:
    print(i)
输出结果
[' \n                        \r\n\t\r\n\t', '\r\n\t\t1、晚上做的菜饭,隔壁萌娃一看说:伯伯你做的菜饭一看就不好吃。', '\r\n我说:可好吃了。', '\r\n他说:我不信,除非你让尝一碗,我才知道。', '\r\n一小碗吃了,我问:好吃吗?', '\r\n他说:还行,要想我夸你做的好吃,你得再给我来一碗。', '\r\n我。。。\r\n\t\r\n\t', '\r\n\t\t2、小的时候喜欢逮蜜蜂,每当逮着一个,就在蜜蜂肚子上扎个洞,就使劲吸,你别说,肚子里的蜂蜜,还真好吃!', '\r\n等以后,慢慢长大上了,上学后,老师告诉我,那是绿豆蝇。。。\r\n\t\r\n\t', '\r\n\t\t3、昨晚去超市给儿子买用来包平安果的苹果,去之前问他买几个,他说两个就够了。', '\r\n我说你那么多好朋友两个怎么够?', '\r\n儿子:有人送给我我就回赠一个,再把他给我的送给别人,两个我觉得都多了。\r\n\t\r\n\t', '\r\n\t\t4、晚上我在厨房做饭,听到小儿子哭,我冲进屋问大儿:你又欺负小弟了?', '\r\n大儿委屈:他踢我,没瞄准,踢板凳上了。。。\r\n\t\r\n\t', '\r\n\t\t5、今天早上儿子悄悄跟我说他快长大了,JJ也快长大了。', '\r\n我说他你长大就长大吧,你的JJ长大了有什么用?', '\r\n他说JJ长大了就会尿的多!', '\r\n我问他尿的多就好吗?', '\r\n他说尿的多就可以浇死更多的蚂蚁。。。', '\r\n孩子,蚂蚁是跟你有仇吗?\r\n\t\r\n\r\n                    ']

循环打印的输出结果

在这里插入图片描述

解决方法

观察到其文本内容中有许多转义字符,循环打印结果与网页中查看不一致便是因此导致,需要对这部分的转义字符进行替换。

代码

joker_text = res_html.xpath("//div[@class='article-text']//text()")
print(joker_text)
tmp_text = []
for text in joker_text:
    tmp_text.append(text.replace("\n","").replace("\r","").replace("\t",""))   ## 将对应的每个文本中的特殊字符进行替换删除
joker_text = "\n".join(tmp_text).strip()       ##  使用join()方法将 换行符与转换后的文本进行追加连接,并使用strip()默认删除空白符(包括'\n', '\r', '\t',  ' ')
print(joker_text)

输出打印结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值