“
初次发布,格式粗糙,望指正!
任务内容:爬取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
文章源代码:
领取专属 10元无门槛券
私享最新 技术干货