用豆瓣电影和掌桥科研练习网页解析的三种方式——正则、Xpath和bs4

news2024/11/15 7:12:50

网页解析

  • 豆瓣电影
    • 解析方式
      • 正则表达式
      • Xpath
      • bs4
    • 翻页
  • 掌桥科研
    • 正则表达式
    • Xpath
    • bs4

豆瓣电影

解析方式

先爬取数据:

# -- coding: utf-8 --**
import requests
import json
import time
import pandas as pd


url='https://movie.douban.com/top250?start=0&filter='
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=header)
print(response)

正则表达式

import re
data = pd.DataFrame()
pattern1 = re.compile(r'<span class="title">([^&]*?)</span>')
titles = pattern1.findall(res.text)
# 通过正则表达式获取class属性为rating_num的span标签并用捕获组提取标签内容
pattern2 = re.compile(r'<span class="rating_num".*?>(.*?)</span>')
ranks = pattern2.findall(res.text)
pattern3 = re.compile(r'<span class="inq">(.*?)</span>')
quito = pattern3.findall(res.text)
data['标题'] = titles
data['评分'] = ranks
data['经典台词'] = quito
data

在这里插入图片描述

Xpath

from lxml import etree
import requests

tree = etree.HTML(res.text)
data = pd.DataFrame()
name = []
Ename = []
rate = []
quito = []
for i in range(1,26):
    # 通过XPath语法从页面中提取电影标题
    title_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[1]/a/span[1]'% i)
    name.append(title_spans[0].text)
    Etitle_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[1]/a/span[2]'% i)
    Ename.append(Etitle_spans[0].text[3:])
    # 通过XPath语法从页面中提取电影评分
    rank_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[2]/div/span[2]'% i)
    rate.append(rank_spans[0].text)
    quito_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[2]/p[2]/span'% i)
    quito.append(quito_spans[0].text)

data['电影名称'] = name
data['电影英文名称'] = Ename
data['电影评分'] = rate
data['经典台词'] = quito
data

在这里插入图片描述

bs4

from bs4 import BeautifulSoup

soup = BeautifulSoup(res.text,'lxml')
article = soup.find('div',class_="article")
data = pd.DataFrame()
li = article.find_all('li')
name = []
Ename = []
rate = []
quito = []
for l in li:
#     print(li[i].find_all('span',class_='title')[0].text)
#     print(li[i].find_all('span',class_='rating_num')[0].text)
#     print(li[i].find_all('span',class_='inq')[0].text)
    name.append(l.find_all('span',class_='title')[0].text)
    if len(l.find_all('span',class_='title'))==2:
        Ename.append(l.find_all('span',class_='title')[1].text[3:])
    else:
        Ename.append('-')
    rate.append(l.find_all('span',class_='rating_num')[0].text)
    quito.append(l.find_all('span',class_='inq')[0].text)
data['电影名称'] = name
data['电影英文名称'] = Ename
data['电影评分'] = rate
data['经典台词'] = quito
data

在这里插入图片描述

翻页

将上面解析数据的代码定义成函数
结果:
在这里插入图片描述
报错了,报错出现在100-125中的某个电影的台词,查看网页发现有一部电影没有一句简描:
在这里插入图片描述
正则直接提取的整页,不方便判断第几个是空缺的,这里直接放弃这个字段(可以尝试正则一个个提取来判断空缺):

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
all_data = pd.DataFrame()
for i in range(0,250,25):
    url='https://movie.douban.com/top250?start=%d&filter='% i
    print(url)
    response = requests.get(url=url, headers=header)
    page_data = re_getdata(response)
    #page_data = xpath_getdata(response)
    #page_data = bs4_getdata(response)
    all_data = pd.concat([all_data,page_data])
print(all_data)
print('全部解析完毕')

Xpath中加入判断:

from lxml import etree
import requests

def xpath_getdata(res):
    tree = etree.HTML(res.text)
    data = pd.DataFrame()
    name = []
    Ename = []
    rate = []
    quito = []
    for i in range(1,26):
        # 通过XPath语法从页面中提取电影标题
        title_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[1]/a/span[1]'% i)
        name.append(title_spans[0].text)
        Etitle_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[1]/a/span[2]'% i)
        Ename.append(Etitle_spans[0].text[3:])
        # 通过XPath语法从页面中提取电影评分
        rank_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[2]/div/span[2]'% i)
        rate.append(rank_spans[0].text)
        quito_spans = tree.xpath('//*[@id="content"]/div/div[1]/ol/li[%d]/div/div[2]/div[2]/p[2]/span'% i)
        if len(quito_spans) == 1:
            quito.append(quito_spans[0].text)
        else:
            quito.append('-')

    data['电影名称'] = name
    data['电影英文名称'] = Ename
    data['电影评分'] = rate
    data['经典台词'] = quito
    return data

在这里插入图片描述

bs4进行相同的更改:

from bs4 import BeautifulSoup

def bs4_getdata(res):
    soup = BeautifulSoup(res.text,'lxml')
    article = soup.find('div',class_="article")
    data = pd.DataFrame()
    li = article.find_all('li')
    name = []
    Ename = []
    rate = []
    quito = []
    for l in li:
    #     print(li[i].find_all('span',class_='title')[0].text)
    #     print(li[i].find_all('span',class_='rating_num')[0].text)
    #     print(li[i].find_all('span',class_='inq')[0].text)
        name.append(l.find_all('span',class_='title')[0].text)
        if len(l.find_all('span',class_='title'))==2:
            Ename.append(l.find_all('span',class_='title')[1].text[3:])
        else:
            Ename.append('-')
        rate.append(l.find_all('span',class_='rating_num')[0].text)
        if len(l.find_all('span',class_='inq')) == 1:
            quito.append(l.find_all('span',class_='inq')[0].text)
        else:
            quito.append('-')
    data['电影名称'] = name
    data['电影英文名称'] = Ename
    data['电影评分'] = rate
    data['经典台词'] = quito
    return data

在这里插入图片描述

在这里插入图片描述

掌桥科研

先爬取数据:

# -- coding: utf-8 --**
import requests
import pandas as pd
from bs4 import BeautifulSoup



url='https://www.zhangqiaokeyan.com/academic-degree-cn_1/'
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
res = requests.get(url=url, headers=header)
print(res)

正则表达式

import re
data = pd.DataFrame()
pattern1 = re.compile(r'<a href=.*? target="_blank">(.*?)</a>')
title = pattern1.findall(res.text)
# 通过正则表达式获取class属性为rating_num的span标签并用捕获组提取标签内容
pattern2 = re.compile(r'<div class="item_mid">\s*<span>(.*?)</span>\s*</div>')
year = pattern2.findall(res.text)
pattern3 = re.compile(r'<div class="item_right">\s*<span>(.*?)</span>\s*</div>')
degree = pattern3.findall(res.text)
data['标题'] = title[0:100] #匹配到了多的内容
data['年份'] = year
data['学位'] = degree
data

在这里插入图片描述

Xpath

from lxml import etree
import requests
tree = etree.HTML(res.text)
data = pd.DataFrame()
title = []
year = []
degree = []
for i in range(2,102):
    # 通过XPath语法从页面中提取电影标题
    title_spans = tree.xpath('/html/body/div[4]/div[2]/ul/li[%d]/div[1]/div/a'% i)
    title.append(title_spans[0].text)
    year_spans = tree.xpath('/html/body/div[4]/div[2]/ul/li[%d]/div[2]/span'% i)
    year.append(year_spans[0].text[3:])
    # 通过XPath语法从页面中提取电影评分
    degree_spans = tree.xpath('/html/body/div[4]/div[2]/ul/li[%d]/div[3]/span'% i)
    degree.append(degree_spans[0].text)
    
data['标题'] = title
data['年份'] = year
data['学位'] = degree
data

在这里插入图片描述

bs4

htm = BeautifulSoup(res.text,'lxml')
ul = htm.find('ul',class_="right_list_3")
li = htm.find_all('li',class_="list_item")



data = pd.DataFrame()
title = []
year = []
degree = []
for i in range(len(li)):
    sp = li[i].find_all('div')
    title.append(sp[1].find('a').text)
    year.append(sp[2].find('span').text)
    degree.append(sp[3].find('span').text)
data['title'] = title 
data['year'] = year 
data['degree'] = degree 
data

在这里插入图片描述

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

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

相关文章

【带头学C++】----- 1.基础知识 ---- 1.21.23.9 位运算符的综合应用

最近做任务&#xff0c;公司项目比较重&#xff0c;赶上1024的活动流量券任务&#xff0c;内容治疗略微有一些杂乱&#xff0c;后期会把专栏目录重新搞一下&#xff0c;内容我是融合了很多课程和书籍包含ai的一些理解&#xff0c;我整理和增加了自己的见解和代码贴图&#xff0…

【java学习—八】关键字static(4)

文章目录 1. 前言2. 关键字static3. 代码理解3.1. 类变量3.2. 类方法3.3. 工具类3.4. 总结 4. 注意事项 1. 前言 当我们编写一个类时&#xff0c;其实就是在描述其对象的属性和行为&#xff0c;而并没有产生实质上的对象&#xff0c;只有通过 new 关键字才会产生出对象&#xf…

10-16/10-17 JavaWeb入门/servlet

JavaWeb 现实生活中的互联网项目都是javaWeb项目, 包含网络, 多线程, 展示: HTML等其他的前端技术, 界面窗体展示(Swing包,AWT包 窗体), C#, JAVAWeb架构:(面试重点&#xff1a;要求记忆) B/S: 浏览器/服务器 优点: 以浏览器作为客户端, 使用这个软件, 用户不需要下载客户端,…

Spring Cloud之服务熔断与降级(Hystrix)

目录 Hystrix 概念 作用 服务降级 简介 使用场景 接口降级 服务端服务降级 1.添加依赖 2.定义接口 3.实现接口 4.Controller类使用 5.启动类添加注释 6.浏览器访问 客户端服务降级 1.添加依赖 2.application.yml 中添加配置 3.定义接口 4.Controller类使用 …

Chat Towards Data Science|如何用个人数据知识库构建 RAG 聊天机器人?

生成式人工智能时代&#xff0c;开发者可以借助大语言模型&#xff08;LLM&#xff09;开发更智能的应用程序。然而&#xff0c;由于有限的知识&#xff0c;LLM 非常容易出现幻觉。检索增强生成&#xff08;RAG&#xff09;https://zilliz.com/use-cases/llm-retrieval-augment…

TS 入门指南

TS 类型基本用法 TS简介 TypeScript&#xff0c;简称 TS&#xff0c; 是一种由微软开发的编程语言&#xff0c;它是对 JavaScript 的一个增强让我们更加方便地进行类型检查和代码重构&#xff0c;提高代码的可靠性和可维护性同时&#xff0c;TypeScript 还支持 ECMAScript 的…

对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中的所有值为x的数据元素

对长度为n的顺序表L&#xff0c;编写一个时间复杂度为O(n)&#xff0c;空间复杂度为O(1)的算法&#xff0c;该算法删除线性表中的所有值为x的数据元素 算法思路&#xff1a; 用count标记遇到x的次数&#xff0c;每次遇到x&#xff0c;count 遇到非x的元素&#xff0c;把它前移…

探索企业基本信息查询API:数据访问的便捷方式

前言 当涉及到获取企业的基本信息时&#xff0c;传统的方法往往需要大量的时间和人力资源&#xff0c;以收集、整理和验证数据。然而&#xff0c;现在有一种便捷的方式可以解决这个问题&#xff0c;那就是通过企业基本信息查询API。本文将探讨这种API是如何成为数据访问的便捷…

【Hive SQL】字符串操作函数你真的会用吗?

文章目录 ININSTRSUBSTRLOCATELIKE 前言&#xff1a; 今天在做一个需求的时候&#xff0c;需要判断字符串中是否包含一个子串&#xff0c;然后我发现了我平常没注意到的一个点&#xff0c;通过这篇博文来记录一下。 IN IN 函数用于判断一个元素是否存在于所给的元素组中&…

【基础架构设计】仿12306系统公共组件设计深度解析

仿12306系统学习 学习路线 12306 铁路购票系统学习总体分为三块&#xff1a;组件库开发、业务梳理以及业务系统开发。 组件库开发 组件库的产出源于对公共功能的封装&#xff0c;避免了在不同项目之间相互复制代码的情况。当然&#xff0c;如果这种复制代码的方式出现问题&a…

红酒种类及更多的红酒基本知识

从法国不拘一格的绿色牧场到北加州的金山&#xff0c;各种不同类型的红葡萄酒从淡色到豪放&#xff0c;从各种不同的种植地区走向世界各地的餐桌。来自云仓酒庄品牌雷盛红酒分享红葡萄酒在味道、酒体、颜色、香味以及它们提供的整体体验方面可以有很大的不同。 为合适的场合选…

amr文件苹果手机怎么打开?四个方法教会你!

Amr格式文件因其资源占用率低、传输方便&#xff0c;通常用作各大手机厂商广泛使用的一种保存录音文件的格式&#xff0c;非常适合制作来电铃声。但是amr音频格式的适用范围有限&#xff0c;很多时候就需要把amr转换成兼容性更好的mp3格式。如何将AMR文件转换为mp3然后在苹果手…

Linux 内核文件系统dentry_path_raw函数

文章目录 一、简介1.1 __dentry_path1.2 prepend_name1.3 d_path 二、dmeo参考资料 一、简介 // linux-5.4.18/fs/d_path.cchar *dentry_path_raw(struct dentry *dentry, char *buf, int buflen) {return __dentry_path(dentry, buf, buflen); } EXPORT_SYMBOL(dentry_path_r…

语雀停服8小时,P0级事故,故障原因和补偿来了。

昨天互联网圈子里发生了一件大事&#xff0c;那就是语雀的 P0 级事故&#xff0c;前后足足停服了 7 个多小时&#xff0c;放眼整个互联网的发展史&#xff0c;都是相当炸裂的表现。 语雀是技术大牛玉伯在蚂蚁金服内部孵化出来的一个云端知识库&#xff0c;整体的界面非常清爽&…

[SQL开发笔记]IN操作符: 在WHERE子句中规定多个值

上一实例我们在where子句使用(year2022 or year2020)&#xff0c;如果我们需要在WHERE子句中规定多个值呢&#xff1f;这时我们将学习IN操作符 一、功能描述&#xff1a; 在WHERE子句中规定多个值。 二、IN操作符语法详解&#xff1a; IN操作符语法&#xff1a; SELECT col…

【Linux】MAC帧协议 + ARP协议

文章目录 &#x1f4d6; 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程&#xff1a;4.2 ARP协议格式&#xff1a; 5. 如何获得目的MAC地址 &#x1f4d6; 前言 在学完网络层IP协议之后&#xff0c;本章我们将继续向下沉一层&#xff0c;进入到数…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用&#xff1a;测量输入的脉冲长度信号&#xff08;输入捕获&#xff09;、产生输出波形&#xff08;输出比较和PWM&#xff09;。 脉冲长度和波形周期可以从几微秒调制到几毫秒&#xff0c;使用…

记录隐藏挖矿木马rcu_tasked的查杀

记录一次项目中挖矿病毒的经历 这是黑客使用的批量蔓延病毒的工具&#xff0c;通过如下脚本 [rootServer .cfg]# cat /home/pischi/.bash_history cd /root/ nvidia-smi;ls -a;cd .cfg;ls -a;wc -l ip ./key 20 -f ip pass 22 "nproc;nvidia-smi;rm -rf .cfg;mkdir .cfg…

怎么做好网络软文推广?媒介盒子为你揭秘

不管是初创公司还是成熟公司&#xff0c;都需要打响品牌知名度&#xff0c;而有些公司在网络推广中的预算不是很高&#xff0c;这个时候就可以利用软文进行推广&#xff0c;今天媒介盒子就来告诉大家&#xff0c;如何写好网络推广软文。 一、 明确推广目标 确定推广目标有助于…

【备考网络工程师】如何备考2023年网络工程师之常见考点篇(1)

文章目录 写在前面涉及知识点1、NSLOOKUP命令设置的几个类型&#xff08;DNS服务器资源记录类型&#xff09;2、结构化综合布线系统的组成3、xDSL及相关概念4、私有地址及A-E类地址4.1 、私有地址4.2 、A-E类地址 总结 写在前面 其实做模拟或真题时候&#xff0c;总是会在关键…