XPath判断当前选中节点的元素类型 Python lxml判断当前Element的元素类型 爬虫爬取页面分元素类型提取纯文本

背景&前言

不知道你们做爬虫的时候,有没有碰到和我一样的情况:将页面提取成纯文本的时候,由于页面中各种链接、加粗字体等,直接提取会造成结果一坨一坨的,非常不规整。有时候还要自己对标题等元素进行修改,麻烦的很。最好呢,有个判断元素类型的方法,能让我们看碟下菜。恰好呢,网上又没有这样的文章,于是乎我就来将一下我在互联网冲浪带回来的经验。

精华

那么如何判断元素类型呢?用name()函数。不过还有一个难点,就是怎么判断当前元素,这个网上文章比较少。怎么办呢?答案是直接调函数。

if item.xpath("name()") == "ul":print("哈哈,被我判断出来了")

或者加上contains()函数一起:

if item.xpath("contains(name(), 'ul')"):print("哈哈,又被我判断出来了")

下面就再介绍一下我碰到具体问题的情况吧。

问题

直接解析提取页面的文本时,会出现非常不规整的结果。

原页面:

页面源代码:

基本是ul-li下有链接a、字体小花样strike等。

直接打印提取代码:

# 定位节点
div = html.xpath("//div[contains(@class,'content-entity-body')]//text()")# 提取
for item in div:print(item)

直接提取打印结果:

可以看到结果很乱。

 解决方法

方法一

判断当前元素,分别进行处理。

提取代码:

# 定位节点,注意这里和之前的方法也不同了
div = html.xpath("//div[contains(@class,'content-entity-body')]")[0]# 提取
for item in div:if item.xpath("contains(name(), 'ul')"):# if item.xpath("name()") == "ul":  # 这样也行for li in item.xpath("./li"):text += ''.join(li.xpath(".//text()")) + '\n'else:text += ''.join(item.xpath(".//text()")) + '\n'

结果:

结果好多了。

方法二

土路子,绕过这个问题,直接判断子节点,因为ul后必跟li。这当然不失为一种办法。

提取代码:

# 定位节点
div = html.xpath("//div[contains(@class,'content-entity-body')]")[0]# 提取
for item in div:# if item.xpath("name()") == "ul":# if item.xpath("contains(name(), 'ul')"):if item.xpath("./li"):  # 直接判断子节点for li in item.xpath("./li"):text += ''.join(li.xpath(".//text()")) + '\n'else:text += ''.join(item.xpath(".//text()")) + '\n'

结果同上。

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

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

相关文章

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作:并发修改异常增强循环遍历数组:遍历集合:遍历字符串:限制 list接口ListIteratorArrayList创建 ArrayList:添加元素:获取元素:修…

【Unity】粒子贴图异常白边问题

从PS制作的黑底,白光的贴图。放入Unity粒子中,拉远看会有很严重的白边,像马赛克一样。 材质使用:Mobile/Particles/Additive 经测试只使用一张黑色的图片,也会有白边。 解决方案: 关闭黑色底&#xf…

【UE 材质】闪电材质

效果 步骤 1. 新建一个材质这里命名为“M_Lighting” 打开“M_Lighting”,设置混合模式为半透明,着色模型为无光照 在材质图表中添加如下节点 其中,纹理采样节点的纹理是一个线条 此时预览窗口中效果如文章开头所示。

自然语言NLP学习

2-7 门控循环单元(GRU)_哔哩哔哩_bilibili GRU LSTM 双向RNN CNN 卷积神经网络 输入层 转化为向量表示 dropout ppl 标量 在物理学和数学中,标量(Scalar)是一个只有大小、没有方向的量。它只用一个数值就可以完全…

第十三章认识Ajax(四)

认识FormData对象 FormData对象用于创建一个表示HTML表单数据的键值对集合。 它可以用于发送AJAX请求或通过XMLHttpRequest发送表单数据。 以下是FormData对象的一些作用: 收集表单数据:通过将FormData对象与表单元素关联,可以方便地收集表…

AF647-羧酸,Alexa-Fluor 647-羧酸,适合用于标记蛋白质

您好,欢迎来到新研之家 文章关键词:AF647-carboxylic-acid ,AF647-COOH,AF647-acid,Alexa-Fluor 647-acid,AF647-羧酸,Alexa-Fluor 647-羧酸 一、基本信息 产品简介:AF647&#x…

周报(20240128)

日期:2024.1.22 - 2024.1.28 本周工作: 1. 阅读论文 本周阅读了以下论文: 《BRAU-Net:用于医学图像分割的U形混合CNN-Transformer网络》 背景 精确的医学图像分割对于临床量化、疾病诊断、治疗计划和许多其他应用至关重要。基…

深度学习核心技术与实践之深度学习研究篇

非书中全部内容,只是写了些自认为有收获的部分。 Batch Normalization 向前传播 (1)三个主要任务:计算出每批训练数据的统计量。 对数据进行标准化 对标…

赛氪荣获“2023天津高新技术企业大会支持单位”

1月23日上午,2023天津市高新技术企业大会新闻发布会在天开高教科技园核心区综合服务中心召开,市高企协以及来自高校、企业、社会组织等80余人现场参会。 大会组委会秘书长张博航介绍到:“本次大会将实现自开办以来的多个首次,首次…

AIDL实践

先贴最后的文件目录: aidl/android/hardware/demo/IFoo.aidl: package android.hardware.demo;import android.hardware.demo.IFooCallback;VintfStability interface IFoo {void doFoo();int doFooWithParameter(int param);void registerCallback(IFo…

案例分析技巧-软件工程

一、考试情况 需求分析(※※※※)面向对象设计(※※) 二、结构化需求分析 数据流图 数据流图的平衡原则 数据流图的答题技巧 利用数据平衡原则,比如顶层图的输入输出应与0层图一致补充实体 人物角色:客户、…

力扣3. 无重复字符的最长子串(滑动窗口)

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 由于题目要求求出字符串中最长的连续无重复字符的最长子串,所以利用这个特性我们可以比较容易的想到利用双指针中的滑动窗口技巧来解决,但在实际的求解中…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据(data.csv) points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据,分别作为x,y …

从CNN ,LSTM 到Transformer的综述

前情提要:文本大量参照了以下的博客,本文创作的初衷是为了分享博主自己的学习和理解。对于刚开始接触NLP的同学来说,可以结合唐宇迪老师的B站视频【【NLP精华版教程】强推!不愧是的最完整的NLP教程和学习路线图从原理构成开始学&a…

TCP_拥塞控制

引言 24年春节马上就要到了,作为开车党,最大的期盼就是顺利回家过年不要堵车。梦想是美好的,但现实是骨感的,拥堵的道路让人苦不堪言。 在网络世界中,类似于堵车的问题也存在,而TCP(Transmissi…

如何使用Everything随时随地远程访问本地电脑搜索文件

文章目录 前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库,我们需要两个软件的支持,分别是cpolar(用于搭建内网穿透数据隧道…

数据结构排序算详解(动态图+代码描述)

目录 1、直接插入排序(升序) 2、希尔排序(升序) 3、选择排序(升序) 方式一(一个指针) 方式二(两个指针) 4、堆排序(升序) 5、冒…

go包与依赖管理

包(package) 包介绍 Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码…

CSS之定位

定位在CSS当中是一个比较重要的点,接下来,让我为大家介绍一下定位吧! 属性描述position-relative相对定位position-absolute绝对定位position-fixed固定定位position-sticky粘性定位position-static静态定位 一、相对定位 给元素设置 posi…

Vue-40、Vue中TodoList案例

1、MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" v-model"title" keyup.enter"add"></div> </template>&…