首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python2.7爬虫字符及BeautifulSoup使用过程中的节点定位问题

初次发布,格式粗糙,望指正!

任务内容:爬取https://www.tripadvisor.cn/首页,获得大洲及各大洲所包含的全部国家、城市、景点数、宾馆数、饭店数信息。

01

编码问题

问题描述:

python2.7:输出的信息中全部为unicode字符,非常难看,存在编码转换问题。

主要原因:

requests爬取到的网页采用的是unicode编码,而命令行输出为gbk编码。get_text()获得的是unicode对象,将其用repr()字符串化后才能调用decode方法。实际上这都是python2.7的问题,到python3.x基本不存在这类问题了。

解决办法:

(1)','.join(results)方法:results为可迭代类型,即将results中元素以,分隔方式拼接,再输出

该方法产生的字符串结果纯做直观输出,进行数据分析时不太适用

(2)安装uniout外部库,调用print进行输出

该方法实用性较好,且能产生便于分析的list、dict数据结构

(3)使用repr(obj).decode('unicode-escape')方法

输出的结果前带'u'字母,不美观,但可行。Repr()与str()类似。最靠谱,麻烦点儿

(4)安装json外部库,调用json.dumps()和json.loads()方法

调用Json.dumps()后能输出中文,但产生的是字符串形式,不便于对list[{},{}]格式的数据进行解析

02

节点定位问题

问题描述:

soup.select()语句中直接从浏览器中赋值过来的CSS selector和CSS path不能正常使用

主要原因:

BeautifulSoup不支持nth-child语法,可以用nth-of-type(n)语法;class属性可以用div.class形式,而其他属性只能用div[属性名=value]的形式,有时可能需要字符串替换。比如 标签的id属性可以用div#id的形式来定位。

解决办法:

(1)字符串替换

Li[data-name={}].format(dataname)

(2)换种思路:查找一类然后筛选

Li[data-name]找到所有包含data-name属性的节点

(3)html5可能对于部分tag标签不支持,如id

用#tag-id的方式访问

具体内容可参考文献:http://www.runoob.com/cssref/sel-nth-of-type.html

文章源代码:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180118G0BZNR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券