Reptile:requests + Xpath 爬取段子网的段子

2019/1/24 中午路飞学成 爬虫课程 实验及笔记。

Xpath是路飞爬虫课程中老师说的三种解析方式之一,前面是re正则表达式的解析方式,现在是xpath的解析方式,后面还有一个是bs4的解析方式。

re其实我理解的很困难,而且到现在都还不怎么理解这个东西到底应该怎么去组合起来,进行匹配,反而这个Xpath我个人觉得比较好理解,他就是通过一步一步的去解析网页的结构来找到你想要的东西,比如有一个三级的结构,你就可以用xpath一级一级的去往下走,直到到达你需要的点就ok了。而且还可以进行模糊查找和逻辑查找。

下面是代码:

# 需求:使用xpath对段子网的内容和标题进行解析,并存储到本地

  import os

  import requests

from lxml import etree

# 指定本地数据存储位置
if not os.path.exists('./Duan zi word'):
os.mkdir('Duan zi word')

# 获取用户输入的页码范围
start_page = int(input("Enter a start pageNum:>>>"))
end_page = int(input("Enter a end pageNum:>>>"))

# 打开文件并生成文件句柄
fp = open('Duan zi word/duanzi.txt', 'w', encoding='utf-8')

# 指定url 和请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/65.0.3325.181 Safari/537.36'
}
for num in range(start_page, end_page + 1, 1):
url = 'http://duanziwang.com/page/' + str(num)

# 发起请求并获取返回数据:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
page_text = response.text

# 实例化etree对象,并对获取的网页数据进行初步解析
tree = etree.HTML(page_text)
article_list = tree.xpath('//article[contains(@id,"")]') # 这里是使用了模糊匹配,用contains取所有包含id的标签,这个里面和课程有点不一样,能是网站更新了吧

# 对初步解析得到的数据进行二次解析,得到标题和正文。xpath得到的Element对象都可以再次调用xpath
for li in article_list:
title = li.xpath('./div[@class="post-head"]/h1[1]/a/text()')[0] # 解析初标题的信息,存到变量中后面写入用 ./是表示在当前标签下去进行查找,当前标签就是这个的父级标签
content = li.xpath('./div[@class="post-content"]/p[1]/text()') # 解析出内容的信息。
try:
fp.write(title + ":" + "\n" + str(content[0]) + "\n\n")
print('\033[31m %s \033[m 已完成写入' % title)
except:
fp.write(title + ":" + "\n\n")
print('\033[32m索引错误\033[m \n')
else:
print("\033[41m链接访问异常,请重新尝试连接....\033[m")

做这个案例的时候碰到了一个小的问题,就是在后面进行二次解析的时候发现会有拿到的列表中有空的,你对空列表进行切片的时候就会报错,超出了列表的索引的范围,没有想到很好的办法进行解决,就尝试使用了
异常处理try 和 except进行处理,没有问题的就直接写入到文件里面去,有问题的就给放在except中去执行,只写一个列表进去,这个问题只存在在内容里面,标题是没有这样的问题的,因为标题是都有的,内
容呢可能是有些用户
没有去写吧,或者直接就吧标题当成了内容就保存,就会出现空的列表的问题。


转载于:https://www.cnblogs.com/wei-yu/p/10317052.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 系统权限

Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用户 ID 和组 ID)。系统各部分也分隔为不同的标识。Linux 据此将不同的应用之间、应用与系统之间分隔开来 ##一、安全架构 Android 安全架构的中心设计点是&#x…

【转载】负数的二进制

https://jingyan.baidu.com/article/29697b9106eb52ab21de3c7a.html 将十进制的负数变成二进制数的过程: 1.写出绝对值的二进制码(原码) 2.取反(反码) 3.1,(补码) 同理,将二进制的负…

保存网络文章以供以后使用Instapaper阅读

Have you ever come across a bunch of great articles that you want to read online, but just don’t have the time? Today we take a look at an online service that allows you to read your articles later, either online, or on an iPhone, or eReader. 您是否曾经遇…

谷歌chrome xp_将非Google任务列表添加到Chrome

谷歌chrome xpMost people rely on a task list to help them remember what they need to do but not everyone wants one that is tied to a Google account. If you have been wanting an independent tasks list then join us as we look at the Tasks extension for Googl…

学习笔记 - MarkDown 语法

学习参考网址:https://www.appinn.com/markdown/index.html # **gitskill**## 标题 ># 这是 H1 >## 这是 H2 >###### 这是 H6## 区块引用 Blockquotes > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipisci…

[BZOJ4671]异或图

description BZOJ 定义两个结点数相同的图\(G1\)与图\(G2\)的异或为一个新的图\(G\), 其中如果\((u,v)\)在\(G1\)与\(G2\)中的出现次数之和为\(1\), 那么边\((u,v)\)在\(G\)中, 否则这条边不在\(G\)中. 现在给定\(s\)个结点数相同的图\(G1...s\),设\(S{G1,G2,...,Gs},\) 问\(S\…

我们生活在最好的时代

2019独角兽企业重金招聘Python工程师标准>>> 没规划的人生叫拼图,有规划的人生叫蓝图; 没目标的人生叫流浪,有目标的人生叫航行! 我们生活在最好的时代:在认知和学习机会上,人人平等&#xff0c…

MapReduce详解和WordCount模拟

最早接触大数据,常萦绕耳边的一个词「MapReduce」。它到底是什么,能做什么,原理又是什么?且听下文讲解。 是什么 MapReduce 即是一个编程模型,又是一个计算框架,它充分采用了分治的思想,将数据处…

无法创建系统映像_如何创建USB驱动器的映像

无法创建系统映像You can back up your USB drive by creating a saved image. You can then take that saved image and clone multiple USB sticks. This guide shows you how to create an image of your USB drive using Windows 10. 您可以通过创建保存的图像来备份USB驱动…

UGUI事件之Drag拖拽事件

UI事件之Drag拖拽事件2.UGUI 事件命名空间   当我们需要使用 UGUI 中的事件的时候,需要在脚本内引入专有命名空间:   using UnityEngine.EventSystems;----------------------------------2.拖拽相关事件接口----------------------------------1.三…

java 通过cookie判断是否登陆

protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 判断cookie是否有登录信息Cookie[] cookies req.getCookies();boolean isLogin false;for(Cookie c : cookies){if("loginInfo".equals(c.getNa…

使用高级管理控制台获得对Windows Home Server的扩展访问

Windows Home Server is easy to setup and use so anyone with basic computer knowledge can operate their own server. But what if you’re an advanced user and want more control over various administrative functions? The Advanced Admin Console Addin gives you…

变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针。如果在函数内对容器元素做了修改,那么就属于变动性算法。 变动性算法源代码分析与使用示例…

[转]QDir类及其用法总结

直接给出原文链接:QDir类及其用法总结 转载于:https://www.cnblogs.com/rainbow70626/p/10330643.html

如何在Outlook中的电子邮件上显示快速操作按钮

There are probably actions you regularly perform in Outlook, such as deleting, archiving, and marking things as read. Here’s how to use Quick Action buttons to add one-click options that appear over every email to perform each action. 您可能会在Outlook中定…

c++读取和写入TXT文件的整理

c读取和写入TXT文件的整理 #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文件 #include <fstream> #include <iomanip> using namespace std;int main() {//ifstream从文件流向内存的ifstream表示文件输入流…

使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1

我在RestTemplate的配置类里使用了 LoadBalancedComponentpublic class RestTemplateConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }}或者 再调用Autowiredprivate RestTemplate restTemplate;必须使用应用名作为代替ip:端口&a…

sh变量特性(3)默认特性

变量说明$0当前脚本的文件名$n传递给脚本或函数的参数&#xff0c;n是数字&#xff0c;第n个参数$#传递给脚本或函数的参数个数$*传递给脚本或函数的所有参数$传递给脚本或函数的所有参数。被””包含时&#xff0c;与$*稍有不同$?上个命令的退出状态&#xff0c;或函数返回值…

zune linux_更新您的Zune Player软件

zune linuxKeeping your computer and software up to date is very important in keeping everything running smooth and secure. It’s also important to keep your geeky gadgets updated as well. Here we take a look at updating a Zune HD. 保持计算机和软件的最新状态…

继承的几种方式

1.借助构造函数实现继承 function Parent() { this.name parent } Parent.prototype.say function () { // 不能被继承 this.say function() { console.log(hello this.name) } } function Child() { Parent.call(this) this.type child } console.log(new Child) // 没有参…