解析带字体乱码的HTML文件
2019-12-16 本文已影响0人
隐墨留白
处理大众点评带字体乱码的HTML文件需要解决两大难点:
- 获得字体文件
- 将字体乱码替换成相对应的字体
第一个难点容易解决,字体文件的链接要么在当前页面中,要么在字体css文件中,然后打开字体文件生成乱码与字体的对照表,这一点是很容易的,我们就来说说第二个难点。
如果整个文件中的乱码只对应一个字体文件那可以像猫眼@face-font破解中那样整体文字替换乱码,但是也有可能出现文件中的乱码对应许多字体文件的情况,那么就需要具体内容具体分析了。
首先是将要替换原带标签的乱码内容提取出来:
#原HTML中带乱码内容:
<b><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
#使用etree提取b标签内容:
res = etree.HTML(response)
shop_list =res.xpath('//div[@class="content"]/div[2]/ul/li')
for shop in shop_list:
shop_pinglun_number_content = shop.xpath('./div[@class="txt"]/div[@class="comment"]/a[@class="review-num"]/b')[0]
html_str = etree.tostring(shop_pinglun_number_content)
html_str2 = etree.tostring(shop_pinglun_number_content).decode()
print(html_str)
print(html_str2)
#结果:
b'<b><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>'
<b><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
看到这是不是一脸懵逼,说好的乱码呢?怎么都变了。反正原理我是不知道的,所以想着换另一种解析方法。
这一次使用parsel库,parsel 是scrapy 出品的,所以如果会scrapy的话这个库应该能很快上手。
res = parsel.Selector(response)
shop_list =res.xpath('//div[@class="content"]/div[2]/ul/li')
for shop in shop_list:
shop_pinglun_number_content = str(shop.xpath('./div[@class="txt"]/div[@class="comment"]/a[@class="review-num"]/b').extract())
print(shop_pinglun_number_content)
#结果 注意这个结果是字符串类型哦
['<b><svgmtsi class="shopNum">\ue8c5</svgmtsi><svgmtsi class="shopNum">\ue914</svgmtsi><svgmtsi class="shopNum">\uf2ca</svgmtsi><svgmtsi class="shopNum">\ue914</svgmtsi></b>']
好了这次能取到了带乱码的内容了。接下来就是替换了正确文字了。
还有个问题需要注意:
content = shop.xpath('./div[@class="txt"]/div[@class="comment"]/a[@class="review-num"]/b').extract()
print(content)
print(type(content))
print(content[0])
# 输出
['<b><svgmtsi class="shopNum">\ue8c5</svgmtsi><svgmtsi class="shopNum">\ue914</svgmtsi><svgmtsi class="shopNum">\uf2ca</svgmtsi><svgmtsi class="shopNum">\ue914</svgmtsi></b>']
<class 'list'>
<b><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
列表中元素取出来后乱码会不可见 。如果有哪位大佬知道怎么解决或者还有更好地方法,请告知,谢谢。