文章目录
实现目标
爬取网页源码后,使用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)
输出打印结果