老师本章我有三个问题

来源: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回答

NavCat

2019-03-19

问题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:

¥也有半角和全角之分,注意是用半角的试试

0
1
蛋切刀
非常感谢!谢谢老师
2019-03-19
共1条回复

蛋切刀

提问者

2019-03-19

1、问题在文件头加入以下代码以后可以解决

import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')


2、替换的问题直接复制当当页面里的¥符号,不要手动打就行

1
1
NavCat
不错哟,加油
2019-03-19
共1条回复

手把手教你把Python应用到实际开发 不再空谈语法

学会项目开发思路,掌握Python高阶用法。

1341 学习 · 244 问题

查看课程