一、问题说明:

今天爬取一个页面,但是获取的文本确实有点问题,将近几个小时都在搞这个问题,刚开始想着直接使用正则把所有中文和中文字符提取出来,但是发现里面还有HTML样式,说白了就是一个HTML字符串,但是直接使用lxml和bs4无法提取出问本,因为中间还有Unicode编码。

二、最终找到一个解决方法:

我感觉肯定有比我这个简单的方法,既然人家页面可以直接用,但是我能力有限,没有想到也没有找到如何解决这中问题,如果有懂得简单方法,还望不吝赐教哈

1、有问题的文本:

这是个列表,每个列表有一个元素,这个元素就是一个含有Unicode编码的HTML样式的字符串,但是还有中文,我没有找到简单的方法解决,下面说说我的笨方法。

1
['"提醒血的教训!乘公交做这个动作,相当于自杀"']
2
['"\\u003Cp\\u003E坐公交车总会听见一句广播:“请不要把头手伸出窗外”。由于太熟悉,很多人有意无意会“忽略”,然而,近日发生在贵州贵阳的一起“公交车惨案”,用血的教训再次提醒大家引以为戒!\\u003C\\u002Fp\\u003E\\u003Cp\\u003E6月17日21时左右,微博网友@我是黑猫你是谁 报料称,在贵阳32路公交车终点站发生一件惨案:两辆公交车把乘客的头夹破了,乘客当场身亡。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp1.pstatp.com\\u002Flarge\\u002Fa36000c653c29d56232\\" img_width=\\"511\\" img_height=\\"110\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E这条微博除了用简短文字表述外,下方还附了5张照片。其中一张照片显示,事发后,两辆32路公交车并排停在一块,10余名观围者站在警戒线外驻足观看。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp3.pstatp.com\\u002Flarge\\u002F9cd0008f557e14ca71e\\" img_width=\\"543\\" img_height=\\"535\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp1.pstatp.com\\u002Flarge\\u002F9c800097f0618ea2779\\" img_width=\\"543\\" img_height=\\"537\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E 网友发布的现场图\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cstrong\\u003E男子疑因打瞌睡头伸到窗外被夹\\u003C\\u002Fstrong\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E记者赶到位于金关村32路公交车终点站时,公交车正常运营,乘客依次排队上下车,没有受到事故影响。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E一位目击者告诉记者,17日中午三四点,一辆32路公交车停在站台入口不远处,后来,另一辆32路公交车进站时,坐在后排的一男子将头伸出了窗外,就在两车并排时,男子的头被两车车身给夹住。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp9.pstatp.com\\u002Flarge\\u002F9c50009822c33b729f8\\" img_width=\\"544\\" img_height=\\"548\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E另一位妇女告诉记者,事发后,她赶紧过去看到公交车的车窗玻璃也碎了。“后来,我听和坐在这名男子旁边的一位女乘客说,在乘车过程中,这名男子一直在打瞌睡,到了终点站后,大家都下车了,就他没有下车,很有可能是这名男子睡着了,头伸出了窗外才发生的意外。”\\u003C\\u002Fp\\u003E\\u003Cp\\u003E有市民表示,就算是男子自己把头伸出窗外,在公交车进站且两车并排时,如果驾驶员能够多往后视镜看一眼,也许悲剧就能避免。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E记者在32路公交车终点站看到,入口处大约有10多米宽,如果是一辆公交车进站,空间还算大,但如果同时两车并排进站的话,空间就显得很狭小。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cstrong\\u003E事情属实,原因正在调查中\\u003C\\u002Fstrong\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E在32路公交车终点站办公室里,工作人员告诉记者说,乘客被两辆公交车车身夹破头身亡的事故属实,不过,对于具体原因他们并不清楚,当事驾驶员、分管领导目前都在交警队接受调查。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E附近的村民告诉记者,这名乘客40岁左右,毕节人,在金关村附近租房居住。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E目前,事故具体原因警方正在调查中。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cstrong\\u003E多知道点儿\\u003C\\u002Fstrong\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E交警说,在汽车行驶的过程中,把身体的某个部位置于车外无异于自杀。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp3.pstatp.com\\u002Flarge\\u002F9c50009822e1ceb37bb\\" img_width=\\"383\\" img_height=\\"232\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E这样的事故常有发生,而且一般都是大事故!汽车行驶中,请注意四件事:\\u003C\\u002Fp\\u003E\\u003Cblockquote\\u003E\\u003Cul\\u003E\\u003Cli\\u003E\\u003Cp\\u003E手勿伸出窗外;\\u003C\\u002Fp\\u003E\\u003C\\u002Fli\\u003E\\u003Cli\\u003E\\u003Cp\\u003E脚勿搭在车窗上;\\u003C\\u002Fp\\u003E\\u003C\\u002Fli\\u003E\\u003Cli\\u003E\\u003Cp\\u003E别让你的宠物把头伸出窗外;\\u003C\\u002Fp\\u003E\\u003C\\u002Fli\\u003E\\u003Cli\\u003E\\u003Cp\\u003E看好孩子\\u003C\\u002Fp\\u003E\\u003C\\u002Fli\\u003E\\u003C\\u002Ful\\u003E\\u003C\\u002Fblockquote\\u003E\\u003Cp\\u003E2014年6月30日,无锡一女子在驾驶车辆时不慎侧翻,由于开车时把手伸出车外,结果酿成悲剧,一只手当场折断,血肉模糊。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp3.pstatp.com\\u002Flarge\\u002F9c800097f084217a4d0\\" img_width=\\"395\\" img_height=\\"436\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E温州一位乘客晚上喝完酒之后乘坐出租车回家,途中把头伸出窗外呕吐,之后用纸巾擦嘴时,旁边一辆车子超上来,刮到其手臂,所幸伤势并不严重。\\u003C\\u002Fp\\u003E\\u003Cp\\u003E还有——\\u003C\\u002Fp\\u003E\\u003Cp\\u003E\\u003Cimg src=\\"http:\\u002F\\u002Fp1.pstatp.com\\u002Flarge\\u002F9c900096e9fd2eac174\\" img_width=\\"440\\" img_height=\\"2967\\" alt=\\"提醒血的教训!乘公交做这个动作,相当于自杀\\" inline=\\"0\\"\\u003E\\u003C\\u002Fp\\u003E\\u003Cp\\u003E看完这些,你还敢将身体伸出车外么?\\u003C\\u002Fp\\u003E\\u003Cp\\u003E来源丨齐鲁晚报(ID:qiluwanbao002)、羊城晚报(ID:wanbaoweixin)、贵州都市报、新浪微博、平安北京、寿光公安、网络\\u003C\\u002Fp\\u003E\\u003Cp\\u003E版权归原作者所有\\u003C\\u002Fp\\u003E"']

2、先把Unicode的编码转换:

这个我刚看到以为很多,直接把这个方法放弃了,后来其他方法找了好久,也没有弄出来,最后又来找这个一个一个替换的方法,发现也就7个,尴尬。。。

1
encode_json = {
2
            '\\u003C': '<',
3
            '\\u003E': '>',
4
            '\\u002F': '/',
5
            '&#x3D;\\':'=',
6
            '&quot;':'',
7
            '\\':'',
8
            '\/':'/'
9
        }
10
print('encode_json',encode_json)
11
for key in encode_json.keys():
12
    title1 = title1.replace(key, encode_json[key])
13
    content1 = content1.replace(key, encode_json[key])

替换之后的正确的HTML字符串:

1
提醒血的教训!乘公交做这个动作,相当于自杀
2
<p>坐公交车总会听见一句广播:“请不要把头手伸出窗外”。由于太熟悉,很多人有意无意会“忽略”,然而,近日发生在贵州贵阳的一起“公交车惨案”,用血的教训再次提醒大家引以为戒!</p><p>61721时左右,微博网友@我是黑猫你是谁 报料称,在贵阳32路公交车终点站发生一件惨案:两辆公交车把乘客的头夹破了,乘客当场身亡。</p><p><img src=http://p1.pstatp.com/large/a36000c653c29d56232 img_width=511 img_height=110 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p>这条微博除了用简短文字表述外,下方还附了5张照片。其中一张照片显示,事发后,两辆32路公交车并排停在一块,10余名观围者站在警戒线外驻足观看。</p><p><img src=http://p3.pstatp.com/large/9cd0008f557e14ca71e img_width=543 img_height=535 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p><img src=http://p1.pstatp.com/large/9c800097f0618ea2779 img_width=543 img_height=537 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p> 网友发布的现场图</p><p><strong>男子疑因打瞌睡头伸到窗外被夹</strong></p><p>记者赶到位于金关村32路公交车终点站时,公交车正常运营,乘客依次排队上下车,没有受到事故影响。</p><p>一位目击者告诉记者,17日中午三四点,一辆32路公交车停在站台入口不远处,后来,另一辆32路公交车进站时,坐在后排的一男子将头伸出了窗外,就在两车并排时,男子的头被两车车身给夹住。</p><p><img src=http://p9.pstatp.com/large/9c50009822c33b729f8 img_width=544 img_height=548 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p>另一位妇女告诉记者,事发后,她赶紧过去看到公交车的车窗玻璃也碎了。“后来,我听和坐在这名男子旁边的一位女乘客说,在乘车过程中,这名男子一直在打瞌睡,到了终点站后,大家都下车了,就他没有下车,很有可能是这名男子睡着了,头伸出了窗外才发生的意外。”</p><p>有市民表示,就算是男子自己把头伸出窗外,在公交车进站且两车并排时,如果驾驶员能够多往后视镜看一眼,也许悲剧就能避免。</p><p>记者在32路公交车终点站看到,入口处大约有10多米宽,如果是一辆公交车进站,空间还算大,但如果同时两车并排进站的话,空间就显得很狭小。</p><p><strong>事情属实,原因正在调查中</strong></p><p>在32路公交车终点站办公室里,工作人员告诉记者说,乘客被两辆公交车车身夹破头身亡的事故属实,不过,对于具体原因他们并不清楚,当事驾驶员、分管领导目前都在交警队接受调查。</p><p>附近的村民告诉记者,这名乘客40岁左右,毕节人,在金关村附近租房居住。</p><p>目前,事故具体原因警方正在调查中。</p><p><strong>多知道点儿</strong></p><p>交警说,在汽车行驶的过程中,把身体的某个部位置于车外无异于自杀。</p><p><img src=http://p3.pstatp.com/large/9c50009822e1ceb37bb img_width=383 img_height=232 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p>这样的事故常有发生,而且一般都是大事故!汽车行驶中,请注意四件事:</p><blockquote><ul><li><p>手勿伸出窗外;</p></li><li><p>脚勿搭在车窗上;</p></li><li><p>别让你的宠物把头伸出窗外;</p></li><li><p>看好孩子</p></li></ul></blockquote><p>2014630日,无锡一女子在驾驶车辆时不慎侧翻,由于开车时把手伸出车外,结果酿成悲剧,一只手当场折断,血肉模糊。</p><p><img src=http://p3.pstatp.com/large/9c800097f084217a4d0 img_width=395 img_height=436 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p>温州一位乘客晚上喝完酒之后乘坐出租车回家,途中把头伸出窗外呕吐,之后用纸巾擦嘴时,旁边一辆车子超上来,刮到其手臂,所幸伤势并不严重。</p><p>还有——</p><p><img src=http://p1.pstatp.com/large/9c900096e9fd2eac174 img_width=440 img_height=2967 alt=提醒血的教训!乘公交做这个动作,相当于自杀 inline=0></p><p>看完这些,你还敢将身体伸出车外么?</p><p>来源丨齐鲁晚报(ID:qiluwanbao002)、羊城晚报(ID:wanbaoweixin)、贵州都市报、新浪微博、平安北京、寿光公安、网络</p><p>版权归原作者所有</p>

3、使用lxml模块或者bs4提取需要的数据:

我这里提取标题,文本,和文本中的图片地址:

1
title_html = etree.HTML(title1)
2
title_str = ''.join(title_html.xpath('//text()'))
3
print('title_str',title_str)
4
content1_html = etree.HTML(content1)
5
# content_str = content1_html.xpath('//text()')
6
content_str = ''.join(content1_html.xpath('//text()'))
7
print('content_str',content_str)
8
9
img_list = content1_html.xpath('//img/@src')
10
print('img_list',img_list)

4、最后提出的结果就是我需要的数据:

1
title_str 提醒血的教训!乘公交做这个动作,相当于自杀
2
content_str 坐公交车总会听见一句广播:“请不要把头手伸出窗外”。由于太熟悉,很多人有意无意会“忽略”,然而,近日发生在贵州贵阳的一起“公交车惨案”,用血的教训再次提醒大家引以为戒!61721时左右,微博网友@我是黑猫你是谁 报料称,在贵阳32路公交车终点站发生一件惨案:两辆公交车把乘客的头夹破了,乘客当场身亡。这条微博除了用简短文字表述外,下方还附了5张照片。其中一张照片显示,事发后,两辆32路公交车并排停在一块,10余名观围者站在警戒线外驻足观看。 网友发布的现场图男子疑因打瞌睡头伸到窗外被夹记者赶到位于金关村32路公交车终点站时,公交车正常运营,乘客依次排队上下车,没有受到事故影响。一位目击者告诉记者,17日中午三四点,一辆32路公交车停在站台入口不远处,后来,另一辆32路公交车进站时,坐在后排的一男子将头伸出了窗外,就在两车并排时,男子的头被两车车身给夹住。另一位妇女告诉记者,事发后,她赶紧过去看到公交车的车窗玻璃也碎了。“后来,我听和坐在这名男子旁边的一位女乘客说,在乘车过程中,这名男子一直在打瞌睡,到了终点站后,大家都下车了,就他没有下车,很有可能是这名男子睡着了,头伸出了窗外才发生的意外。”有市民表示,就算是男子自己把头伸出窗外,在公交车进站且两车并排时,如果驾驶员能够多往后视镜看一眼,也许悲剧就能避免。记者在32路公交车终点站看到,入口处大约有10多米宽,如果是一辆公交车进站,空间还算大,但如果同时两车并排进站的话,空间就显得很狭小。事情属实,原因正在调查中在32路公交车终点站办公室里,工作人员告诉记者说,乘客被两辆公交车车身夹破头身亡的事故属实,不过,对于具体原因他们并不清楚,当事驾驶员、分管领导目前都在交警队接受调查。附近的村民告诉记者,这名乘客40岁左右,毕节人,在金关村附近租房居住。目前,事故具体原因警方正在调查中。多知道点儿交警说,在汽车行驶的过程中,把身体的某个部位置于车外无异于自杀。这样的事故常有发生,而且一般都是大事故!汽车行驶中,请注意四件事:手勿伸出窗外;脚勿搭在车窗上;别让你的宠物把头伸出窗外;看好孩子2014630日,无锡一女子在驾驶车辆时不慎侧翻,由于开车时把手伸出车外,结果酿成悲剧,一只手当场折断,血肉模糊。温州一位乘客晚上喝完酒之后乘坐出租车回家,途中把头伸出窗外呕吐,之后用纸巾擦嘴时,旁边一辆车子超上来,刮到其手臂,所幸伤势并不严重。还有——看完这些,你还敢将身体伸出车外么?来源丨齐鲁晚报(ID:qiluwanbao002)、羊城晚报(ID:wanbaoweixin)、贵州都市报、新浪微博、平安北京、寿光公安、网络版权归原作者所有
3
img_list ['http://p1.pstatp.com/large/a36000c653c29d56232', 'http://p3.pstatp.com/large/9cd0008f557e14ca71e', 'http://p1.pstatp.com/large/9c800097f0618ea2779', 'http://p9.pstatp.com/large/9c50009822c33b729f8', 'http://p3.pstatp.com/large/9c50009822e1ceb37bb', 'http://p3.pstatp.com/large/9c800097f084217a4d0', 'http://p1.pstatp.com/large/9c900096e9fd2eac174']

三、总结:

这个问题其他如果当初我就用笨方法,一个一个替换,其实也不会弄了这么久,但是找的过程我也复习了下正则,还学习了一个正则匹配所有的中文汉字和中文标点符号的,但是由于本文的后来发现是个HTML,含有我需要的图片地址,所以还不能直接全部只提取中文,而且里面文字中还有英文数字,所以发现正则行不通,python中也没有找的好的方法。

其中中间找的一个可以把所以Unicode的字符串全部匹配正确,因为是字符串,可以使用:

1
ret.encode('utf-8').decode('unicode_escape')

得到的结果:
从结果来看,如果全部是Unicode的编码字符串,可以使用上面的一句话解决问题,,下面的结果中,第一行是人家的中文字符+Unicode+英文字符,下面是转换之后的结果,Unicode编码的都解码成功,但是中文的字符(汉字和中文标点符号)都是乱码。

在这里插入图片描述
在这里插入图片描述

至此,我的笨方法解决过程就这么多了,如果有简单方法的大佬,还望不吝赐教哈,谢谢。