python爬虫——提取抓取内容(6)使用XPath爬取好段子

一.分析

1.url:

http://www.haoduanzi.com/category/?1-1.html
http://www.haoduanzi.com/category/?1-2.html
所以可以设置为url=‘http://www.haoduanzi.com/category/?1-{}.html’

2.编码:utf-8

在这里插入图片描述

3.每个段子的标签:div_list = tree.xpath('//div[@class="left"]/ul[@class="list-box"]/li[not(@class)]')

在这里插入图片描述

4…标题:title = odiv.xpath('.//h2/text()')[0]

在这里插入图片描述

5.每个段子的内容:text = odiv.xpath('.//div[@class="content"]/a/p/text()')

注意:这里从第二页开始,因为第一页中代码有点小瑕疵,有的内容不在p标签
在这里插入图片描述

6.赞和踩:good_bad_lt = odiv.xpath('.//div[@class="ping x1"]/a[@class="good" or @class="bad"]/span/text()')

在这里插入图片描述

二.代码

import urllib.request
import urllib.parse
from lxml import etree
import time
import json


item_list = []


def handle_request(url, page):
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
    }
    # 拼接url
    url = url.format(page)  # http://www.haoduanzi.com/category/?1-1.html
    # print(url)
    request = urllib.request.Request(url=url, headers=headers)
    return request


def parse_content(content):
    # 生成对象
    tree = etree.HTML(content)
    # 抓取内容,过滤不需要的li标签(li[not(@class)])
    div_list = tree.xpath('//div[@class="left"]/ul[@class="list-box"]/li[not(@class)]')
    # print(div_list)
    # print(len(div_list))  # 一页10个
    for odiv in div_list:
        # 获取标题
        title = odiv.xpath('.//h2/text()')[0]
        # print(title)
        # 获取每个内容
        text_lt = odiv.xpath('.//div[@class="content"]/a/p/text()')
        text = '\n'.join(text_lt)
        # print(text)
        # 获取点赞和踩
        good_bad_lt = odiv.xpath('.//div[@class="ping x1"]/a[@class="good" or @class="bad"]/span/text()')
        good_bad = '\t'.join(good_bad_lt)
        # print(good_bad)
        item = {
            '标题': title,
            '内容': text,
            '赞和踩': good_bad
        }
        # 将类容添加到列表中
        item_list.append(item)


def main():
    start_page = int(input("请输入起始页码:"))
    end_page=int(input("请输入结束页码:"))
    url = 'http://www.haoduanzi.com/category/?1-{}.html'
    for page in range(start_page, end_page+1):
        print("第%s页开始爬取······" % page)
        request = handle_request(url, page)
        content = urllib.request.urlopen(request).read().decode()
        # 解析内容
        parse_content(content)
        time.sleep(2)
    with open('haoduanzi.txt', 'w', encoding='utf8') as fp:
        fp.write(str(item_list))
        print("第%s页爬取完成······" % page)
    print("爬取结束!!!")


if __name__ == "__main__":
    main()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值