python中XPath与bs4的简单使用

2023-10-31

XPath是XML路径语言,它是一种用来确定XML文档中某部分位置的语言。

在python爬虫方面的学习中,xpath至关重要,它与正则相比具有明显的优势。下面将介绍在python中xpath的简单使用。

安装方法不必多说,与其他第三方库的安装方法一样,使用pip安装。

使用方式

首先需要导入库

import lxml.html

接下来就是使用了,话不多说,上代码

# 使用方式介绍
#---------------------------------
#/     从根标签开始
#//    从当前标签
#*     通配符,选择所有
#//div/book[1]/title  选择div下第一个book标签的title元素
#//div/book/title[@lang='zh'] 选择title属性含有lang且内容为zh的title元素
#//div/book/title[@*] 将含有属性的title标签选出来
#//div/book/title/@*  将title标签中的属性值选出来
#//div/book/title/text() 选出title标签中的内容,使用内置函数text()
#//div/book/title  //book/title  //title具有相同的结果
#//a[@href='link1.html' and @id='places_neighbours__row'] 把两个条件都满足的a标签选出来
#//a[@href='link1.html' or @id='places_neighbours__row'] 把满足任意一个条件的a标签选出来
#//a[not(@href)] 将不存在href元素的a标签选出来
#//a[@href!='link1.html'] 将存在href元素 但不等于link1.html的a标签选出来
#//li[starts-with(@class,'item')] 将class属性前缀是item的li标签选出来
#//li[contains(@class,'ct')] 将class属性中含有ct关键字的li标签选出来
#//div/book[last()]/title/text() 将最后一个book元素中title内容选出来
#//div/book[last()-1]/title/text() 将倒数第二个book元素中title内容选出来
#//div/book[price > 39]/title/text() 将book中price标签中的内容大于39的选出来
#//book/descendant::* 将后续节点全部选出
#//book/ancestor::* 将祖先节点全部选出

#示例
#------------------------------
test_data = """
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html" id="places_neighbours__row">9,596,960first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html" id="places_neighbours__row">fourth item</a></li>
                 <li class="item-0"><a>fifth item</a></li>
                 <li class="bectter"><a>fifth item</a></li>
             </ul>
             <book>
                    <title lang="eng">Harry Potter</title>
                    <price>29.99</price>
            </book>
            <book>
                <title lang="zh" id="places_neighbours__row">Learning XML</title>
                <price>38</price>
            </book>
            <book>
                <title>Python</title>
                <price>55.55</price>
            </book>
         </div>
        """
html = lxml.html.fromstring(test_data)
# html_data = html.xpath("//div/book/title[@lang='zh']")
# html_data = html.xpath("//div/book/title[@*]")
# html_data = html.xpath("//div/book/title/@*")
# html_data = html.xpath("//div/book/title/text()")
# html_data = html.xpath("//a[@href='link1.html' and @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[@href='link2.html' or @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[not(@href)]/text()")
# html_data = html.xpath("//a[@href!='link1.html']/text()")
# html_data = html.xpath("//li[@class!='item-0' and @class!='item-1']/a/text()")
# html_data = html.xpath("//div/book[last() ]/title/text()")
# html_data = html.xpath("//div/book[price = 39]/title/text()")
# html_data = html.xpath("//div/book[price < 39 and price >30]/title/text()")
# html_data = html.xpath("//li[starts-with(@class,'item')]/a/text()")
html_data = html.xpath("//li[contains(@class,'ct')]/a/text()")
# html_data = html.xpath("//book/descendant::*")
# html_data = html.xpath("//book/ancestor::*")
# html_data = html.xpath("//div/ul/li[@class='item-0'][1]/a/text()")
print(html_data)
for i in html_data:
    print(type(i))


bs4

bs4可以说是别人将xpath再进行了封装,然后供我们使用的更简单的方法,当然,它跟xpath相比运用更简单,但是没有xpath功能全。在实际的爬虫运用中,一些简单的网站爬取不需要用xpath,当然更不需要用正则,这个时候我们可以使用bs4。

导入方法

from bs4 import BeautifulSoup

基本运用

soup = BeautifulSoup(test_data,'lxml')

#基本功能介绍
#--------------------
#标签和属性
# print(soup.a)#获取标签
# print(soup.a['href'])#获取标签属性
# print(soup.a.text)#获取标签内容 .contents也可以
# a_list = soup.find_all("a")#获取所有a标签

#示例
#---------------------
# for a in a_list:
#     print(a.text)
# print(soup.li.contents[0]['href'])
#选出id=places_neighbours__row的所有a标签
# a_place = soup.find_all("a",id="places_neighbours__row")
# print(a_place)
#选出id=places_neighbours__row的所有标签
attrs_place = soup.find_all(attrs={"id":"places_neighbours__row"})
print(attrs_place)

最后,附上一个运用xpath爬取糗事百科的代码。。

import requests
import lxml.html

class ParseXpath:
    def __init__(self,page):
        """
        初始化对象
        :param page:页码 
        """
        #请求头
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        }
        #代理IP
        self.proxies = {"http":"http://39.137.69.6:80"}
        self.request = requests.get('https://www.qiushibaike.com/8hr/page/'+str(page)+'/',proxies=self.proxies,headers=self.headers)

    def parse_xpath(self,text):
        """
        标签匹配函数
        :param text: 页面内容
        :return: 匹配到的内容
        """
        html = lxml.html.fromstring(text)
        html_data = html.xpath("//*/div/a[1]/div/span/text()")
        return html_data

    def save_info(self,data_lists):
        """
        保存到文档中
        :param data_lists:数据列表
        :return:
        """
        for i in data_lists:
            with open('./txt/01.txt','ab') as f:
                f.write(i.encode('utf-8'))
    def run(self):
        """
        运行函数
        :return: 
        """
        lists = self.parse_xpath(self.request.text)
        self.save_info(lists)
parse = ParseXpath(4)
parse.run()

欢迎各位积极评论,本人刚开始做爬虫,希望与各位共同学习,共同进步。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中XPath与bs4的简单使用 的相关文章

  • 如何覆盖 Django 的默认管理模板和布局

    我正在尝试覆盖 Django 的默认模板 现在只有base site html 我正在尝试更改 django 管理文本 我做了以下事情 我在我的应用程序目录中创建了一个文件夹 opt mydjangoapp templates admin
  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • 检测到通过 ChromeDriver 启动的 Chrome 浏览器

    我正在尝试在 python 中使用 selenium chromedriver 来访问 www mouser co uk 网站 然而 从第一次拍摄开始 它就被检测为机器人 有人对此有解释吗 此后我使用的代码 options Options
  • 从 Python 下载/安装 Windows 更新

    我正在编写一个脚本来自动安装 Windows 更新 我可以将其部署在多台计算机上 这样我就不必担心手动更新它们 我想用 Python 编写这个 但找不到任何关于如何完成此操作的信息 我需要知道如何搜索更新 下载更新并从 python 脚本安
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • 将二维数组放入 Pandas 系列中

    我有一个 2D Numpy 数组 我想将其放入 pandas 系列 而不是 DataFrame 中 gt gt gt import pandas as pd gt gt gt import numpy as np gt gt gt a np
  • 如何在VIM中设置文件的正确路径?

    每当我击中 pwd在 vim 中命令总是返回路径C Windows system32 即使我在桌面上的 Python 文件中 所以每当我跑步时 python 命令返回 python can t open file Users myname
  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • CNTK 抱怨 LSTM 中的动态轴

    我正在尝试在 CNTK 中实现 LSTM 使用 Python 来对序列进行分类 Input 特征是固定长度的数字序列 时间序列 标签是 one hot 值的向量 Network input input variable input dim
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • GradientTape 根据损失函数是否被 tf.function 修饰给出不同的梯度

    我发现计算的梯度取决于 tf function 装饰器的相互作用 如下所示 首先 我为二元分类创建一些合成数据 tf random set seed 42 np random seed 42 x tf random normal 2 1 y
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • falcon,AttributeError:“API”对象没有属性“create”

    我正在尝试测试我的猎鹰路线 但测试总是失败 而且看起来我把所有事情都做对了 my app py import falcon from resources static import StaticResource api falcon API
  • Python对象初始化性能

    我只是做了一些快速的性能测试 我注意到一般情况下初始化列表比显式初始化列表慢大约四到六倍 这些可能是错误的术语 我不确定这里的行话 例如 gt gt gt import timeit gt gt gt print timeit timeit
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • Python问题:打开和关闭文件返回语法错误

    大家好 我发现了这个有用的 python 脚本 它允许我从网站获取一些天气数据 我将创建一个文件和其中的数据集 有些东西不起作用 它返回此错误 File

随机推荐

  • 数据库查询出结果后将时间排序后取第一条

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 查询出结果后将时间排序后取第一条 select from a where time lt 2017 03 29 19 30 36 order by time desc li
  • Hive 表操作(HIVE的数据存储、数据库、表、分区、分桶)

    1 Hive的数据存储 Hive的数据存储基于Hadoop HDFS Hive没有专门的数据存储格式 存储结构主要包括 数据库 文件 表 试图 Hive默认可以直接加载文本文件 TextFile 还支持sequence file 创建表时
  • windows11 打开chrome浏览器闪屏黑屏问题

    windows11 家庭版打开chrome浏览器的时候 电脑闪屏 甚至长时间黑屏 不得不重启 修复方法 在Google Chrome中禁用 平滑滚动 1 打开chrome 然后输入在地址栏输入 chrome flags 2 搜索名为Smoo
  • 8招搞定XenServer虚拟机优化

    XenServer是一款虚拟机软件 他的免费版本功能相对强大 相比VMware的ESXi来说 所以现在很多企业简单应用上都会用这款软件 以减小开支 VMware收费实在是太贵了 一般的企业是承担不起的 一般虚拟化之后 一台宿主机上面都会运行
  • 也说MSDN

    看到iCynosure在介绍 MSDN使用经验 忍不住也进来加两句 平时很喜欢在IE里面用alt D来切换到地址栏 但是MSDN Explorer不支持这个快捷方式 经过一番研究发现可以通过Option里面的keyboard来自定义快捷键
  • react基础04--redux 管理数据

    react基础04 redux 管理数据 1 介绍 2 方法 案例 在多个组件中使用Store中的数据 规范 store 写法 修改Store中的数据 refs属性获取元素对象 redux thunk 中间件 3 注意事项 4 说明 1 介
  • 怎么在蓝桥杯多拿点分

    蓝桥杯常考的算法有 1 枚举 暴力 2 递归 3 贪心 4 搜索 dfs和bfs 等基础算法 难度比较大的是动态规划 严格按要求输出 不要画蛇添足地打印类似 请您输入 的多余内容 能用到的函数 比如sort next permutation
  • Matplotlib可视化(2)设置pyplot的rcParams

    pylot使用rc配置文件来自定义图形的各种默认属性 称之为rc配置或rc参数 通过rc参数可以修改默认的属性 包括窗体大小 每英寸的点数 线条宽度 颜色 样式 坐标轴 坐标和网络属性 文本 字体等 rc参数存储在字典变量中 通过字典的方式
  • 2.线程常见方法

    Java多线程文章目录 目录 设置优先级 join方法 sleep方法 sleep 实现秒表功能 常见面试题 setDaemon方法 设置优先级 同优先级别的线程 采取的策略就是先到先服务 使用时间片策略 如果优先级别高 被CPU调度的概率
  • Clion-安装

    Clion安装 1 注册Jetbraions账号 https www jetbrains com 2 学生认证使用 baipiao 一年 https www jetbrains com shop eform students 3 下载Min
  • Postman提取返回值

    json响应结果 Postman是做接口测试的 但是很多接口并不是直接就能测试的 需要一些预处理 比如登录的时候 需要传递一个token 如果是网页测试 一般打开登录页面的时候就会自动生成一个token 如果返回的是json格式 用Post
  • 4 SpringBoot整合RocketMQ实现消息发送和接收

    我们使用主流的SpringBoot框架整合RocketMQ来讲解 使用方便快捷 最终项目结构如下 具体步骤如下 第一步 我们新建一个父项目rocketmq test pom类型 主要是依赖管理 包括版本的管理 以及管理module子项目 p
  • pygame库基础模块汇总

    目录 1 安装 2 使用 3 display显示模块 4 draw模块 5 event模块 event可以判断的事件 键盘事件key 6 font模块 7 time模块 8 基本框架 Pygame 是一个专门用来开发游戏的 Python 模
  • Qt+OpenGL——屏幕坐标转OpenGL归一化后的坐标

    OpenGL在显示图形时是将坐标转化为以屏幕中心为原点的一个坐标系 屏幕显示区域的x y轴的取值区间都是 1 1 如图 Qt界面的坐标系是以左上角为原点的坐标系 将鼠标点击的点转化为OpenGL坐标的算法较为简单 不再赘述直接以代码的形式进
  • 100个经典C语言程序(益智类)

    100个经典C语言程序 益智类 1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 利用cos x 的左右对称性 将屏幕的行方向定义为x 列方向定义为y 则0 180度的图形与180 360度的图形
  • C语言中的指针的新认识(一)

    从开始学习C语言到现在遇到最难的问题始终是指针的问题 所以希望每次都有新的体会 然后再记录下来 能看到自己的成长 最近知道的一个新的体会 指针指向的是一个地址 所以指针所要给的值也是一个地址 所以有了这样一个值 int a 0 int p
  • 反向代理神器 Nginx Proxy Manager 快速部署(Docker-compose)

    快速部署 本文将使用 NginxProxyManager 中文版 介绍NginxProxyManager基于Docker compose的快速部分方法 GitHub xiaoxinpro nginx proxy manager zh Doc
  • Vue <router-link>标签绑定@click点击事件失败

    失败原因 router link标签本身会阻止click事件 使用常规的 click绑定点击事件自然会失败 解决方案 click之后添加native修饰符
  • 弹性伸缩:云计算中的自动资源调度

    弹性伸缩是什么 它又在云计算中是如何工作的 随着云计算技术的不断发展 弹性伸缩作为其核心特性之一 越来越受到人们的关注 那么 弹性伸缩到底是什么呢 它又是如何工作的呢 首先 让我们来了解一下弹性伸缩的定义 在云计算中 弹性伸缩是指一种可根据
  • python中XPath与bs4的简单使用

    XPath是XML路径语言 它是一种用来确定XML文档中某部分位置的语言 在python爬虫方面的学习中 xpath至关重要 它与正则相比具有明显的优势 下面将介绍在python中xpath的简单使用 安装方法不必多说 与其他第三方库的安装