老师本章我有三个问题
来源:2-8 爬取当当网的数据

蛋切刀
2019-03-18
先贴代码
#-*- coding:utf-8 –*-
import requests
from lxml import html
def spider(sn):
# 爬取当当网数据
url = 'http://search.dangdang.com/?key={sn}&act=input'.format(sn=sn)
# 获取html内容
html_data = requests.get(url).text
# xpath对象
selector = html.fromstring(html_data)
# 找到书本列表
ul_list = selector.xpath('//div[@id="search_nature_rg"]/ul/li')
#print(len(ul_list))
for li in ul_list:
#标题
title = li.xpath('a/@title')
print(title[0])
#购买链接
link = li.xpath('a/@href')
print(link[0])
#价格
price = li.xpath('p[@class="price"]/span[@class="search_now_price"]/text()')
print(price[0].replace('¥',''))
#商家
store = li.xpath('p[@class="search_shangjia"]/a/@title')
store = '当当自营' if len(store) == 0 else store[0]
print(store)
print("---------------------------")
if __name__ == '__main__':
sn = '9787115428028'
spider(sn)
1.在atom里跑,是可以有结果的,但是在powershell里跑报错,怎么解决
UnicodeEncodeError: 'gbk' codec can't encode character '\xa5' in position 0: illegal multibyte sequence
2.xpath里比如p标签下有三个没有class也没有id的span,怎么获取指定的第几个,比如下列代码
<p>
<span></span>
<span></span>
<span></span>
<!---
此时我想获取第二个或者第三个span的内容怎么写呢?
li.xpath('p/span[*]/text()')????这样报错
--->
</p>
3.print(price[0].replace('¥',''))
没有过滤掉¥是很奇怪
写回答
2回答
-
问题1:
可能跟你的文件编码和操作系统有关,尝试设置文件的编码为utf-8的方式试试,但不要纠结在这些小点上。
问题2:
参考这种方式:
# 获取html内容 html_data = """<p><span>1</span><span>2</span><span>3</span></p>""" # xpath对象 selector = html.fromstring(html_data) span1 = selector.xpath('//p/span[1]/text()') print(span1) span2 = selector.xpath('//p/span[2]/text()') print(span2) span3 = selector.xpath('//p/span[last()]/text()') print(span3)
问题3:
¥也有半角和全角之分,注意是用半角的试试
012019-03-19 -
蛋切刀
提问者
2019-03-19
1、问题在文件头加入以下代码以后可以解决
import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
2、替换的问题直接复制当当页面里的¥符号,不要手动打就行
112019-03-19
相似问题