HTML文本转DOM树的两种方式

1、使用lxml.etree

from lxml import etree

html = etree.HTML(html_text)
html.xpath("//div[@class='tabslider']/ul")

2、使用scrapy团队开源的parsel库(推荐)

Parsel官方文档

from parsel import Selector

# 构建DOM树
html = Selector(text=html_text or xml_text)

'''
解析结果的获取,只适用于parsel解析
'''
# 返回单个字符串
html.xpath("...").get()
html.xpath("...").extract_first()

# 返回结果列表
html.xpath("...").getall()
html.xpath("...").extract()

# 获取节点属性
html.xpath("...").attrib  # 返回字典
html.xpath("...").attrib["href"]  # 获取属性值

# 使用正则进行截取
html.xpath("...").re_first("\d+")

爬虫一般都是使用requests库获取网页源码,再使用xpath进行解析,有时候会遇到乱码问题,可以尝试如下方式:

res = requests.get(url, headers={...})
selector = Selector(text=res.content.decode("utf-8"))

注:

1、xpath解析默认是从 根节点 开始,加上 “.” 表示从 当前节点 开始

2、// 表示检索所有 子孙 节点, / 表示检索所有 节点

 

Xpath实用技巧(后续更新)

# 多个表达式, ele表示当前所选元素
ele.xpath("//ul//a/text() | //li/@class")


# 选择节点的特定子元素(不是子孙元素),child是xpath默认的轴
# 平时省略不写,知道有这东西存在就行了 >_<
ele.xpath("//ul/child::*")
ele.xpath("//ul/child::li")

# 使用position定位
ele.xpath('//li[@class="cxs" and postion()>1]')

# count统计节点的数量
ele.xpath("//ul[count(li)]")

# 获取节点及子孙节点所有本文
ele.xpath("//span//text()")  # 返回列表
ele.xpath("string(//li[@class])")  # 返回字符串

 

CSS选择器

获取 奇数 | 偶数 节点

# 奇数节点
ele.css("ul li:odd")

# 偶数节点
ele.css("ul li:even")

first-child和first-of-type区别

# div中的第一个子元素
div:first-child  

# div中的第一个p元素
div p:first-of-type  

 

关于tbody标签

在解析列表数据时间,在审查元素中发现 <tbody> 标签时

<table>
    <tbody>
        <tr>...</tr>
        <tr>...</tr>

先别急着在xpath规则中加入tbody标签,先 Ctrl + U  检查网页源码中是否存在(我被坑了好几次,有时在有时不在 = = !)

 

言の

下面是我的个人公众号,刚毕业的一线互联网爬虫工程师,会经常在里面发布一些python和爬虫的小技巧,也会发布一些个人随笔,喜欢一个人思考,喜欢二次元,喜欢编程,喜欢冬夜里无人的村庄~

夜,迎风而立 
为浩劫 
为潜伏的凶手 
铺下柔软的地毯 
摆好一排排贝壳的杯盏  

                        —  北岛《岛》

 

 

本文地址:https://blog.csdn.net/qq_40734108/article/details/109923770