使用 lxml 中的 xpath 高效提取文本与标签属性值

简介: 以下代码在 python 3.5 + jupyter notebook 中运行测试无误!   # 我们爬取网页的目的,无非是先定位到DOM树的节点,然后取其文本或属性值 myPage = ''' TITLE 我的博客 ...

 以下代码在 python 3.5 + jupyter notebook 中运行测试无误!

 

# 我们爬取网页的目的,无非是先定位到DOM树的节点,然后取其文本或属性值

myPage = '''<html>
        <title>TITLE</title>
        <body>
        <h1>我的博客</h1>
        <div>我的文章</div>
        <div id="photos">
         <img src="pic1.jpeg"/><span id="pic1">PIC1 is beautiful!</span>
         <img src="pic2.jpeg"/><span id="pic2">PIC2 is beautiful!</span>
         <p><a href="http://www.example.com/more_pic.html">更多美图</a></p>
         <a href="http://www.baidu.com">去往百度</a>
         <a href="http://www.163.com">去往网易</a>
         <a href="http://www.sohu.com">去往搜狐</a>
        </div>
        <p class="myclassname">Hello,\nworld!<br/>-- by Adam</p>
        <div class="foot">放在尾部的其他一些说明</div>
        </body>
        </html>'''
        
html = etree.fromstring(myPage)

# 一、定位
divs1 = html.xpath('//div')
divs2 = html.xpath('//div[@id]')
divs3 = html.xpath('//div[@class="foot"]')
divs4 = html.xpath('//div[@*]')
divs5 = html.xpath('//div[1]')
divs6 = html.xpath('//div[last()-1]')
divs7 = html.xpath('//div[position()<3]')
divs8 = html.xpath('//div|//h1')
divs9 = html.xpath('//div[not(@*)]')

# 二、取文本 text() 区别 html.xpath('string()')
text1 = html.xpath('//div/text()')
text2 = html.xpath('//div[@id]/text()')
text3 = html.xpath('//div[@class="foot"]/text()')
text4 = html.xpath('//div[@*]/text()')
text5 = html.xpath('//div[1]/text()')
text6 = html.xpath('//div[last()-1]/text()')
text7 = html.xpath('//div[position()<3]/text()')
text8 = html.xpath('//div/text()|//h1/text()')


# 三、取属性 @
value1 = html.xpath('//a/@href')
value2 = html.xpath('//img/@src')
value3 = html.xpath('//div[2]/span/@id')


# 四、定位(进阶)
# 1.文档(DOM)元素(Element)的find,findall方法
divs = html.xpath('//div[position()<3]')
for div in divs:
    ass = div.findall('a')  # 这里只能找到:div->a, 找不到:div->p->a
    for a in ass:
        if a is not None:
            #print(dir(a))
            print(a.text, a.attrib.get('href')) #文档(DOM)元素(Element)的属性:text, attrib

# 2.与1等价
a_href = html.xpath('//div[position()<3]/a/@href')
print(a_href)

# 3.注意与1、2的区别
a_href = html.xpath('//div[position()<3]//a/@href')
print(a_href)

 

目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
126 5
|
JavaScript 前端开发 测试技术
Datatables展示数据(表格合并、日期计算、异步加载数据、分页显示、筛选过滤)
Datatables展示数据(表格合并、日期计算、异步加载数据、分页显示、筛选过滤)
163 0
Datatables展示数据(表格合并、日期计算、异步加载数据、分页显示、筛选过滤)
fastadmin框架获取富文本内容(不过滤HTML标签)
fastadmin框架获取富文本内容(不过滤HTML标签)
331 0
|
存储 自然语言处理 算法
Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合)
其实很早以前就想搞一套完备的标签云架构了,迫于没有时间(其实就是懒),一直就没有弄出来完整的代码,说到底标签对于网站来说还是很重要的,它能够对一件事物产生标志性描述,通常都会采用相关性很强的关键字,这样不仅便于检索和分类,同时对网站的内链体系也是有促进作用的。
Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合)
table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】
table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】
299 0
table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】
|
JavaScript 前端开发 C#
JavaScript基础插曲—元素样式,正则表达式,全局模式,提取数组
JavaScript基础插曲—元素样式,正则表达式,全局模式,提取数组
144 0
JavaScript基础插曲—元素样式,正则表达式,全局模式,提取数组
|
JSON JavaScript 前端开发
JavaScript基础插曲—获取标签,插入元素,操作样式
JavaScript基础插曲—获取标签,插入元素,操作样式
199 0
JavaScript基础插曲—获取标签,插入元素,操作样式
|
JavaScript 前端开发
#yyds干货盘点#【js学习笔记六】数组双重去重的方式五对象属性去重
#yyds干货盘点#【js学习笔记六】数组双重去重的方式五对象属性去重
124 0
#yyds干货盘点#【js学习笔记六】数组双重去重的方式五对象属性去重
|
Python
python编程:合并文本_利用列表或字典将两个通讯录文本合并-7
python编程:合并文本_利用列表或字典将两个通讯录文本合并-7
191 0
POI批量替换world文档XWPFParagraph.getRuns 出现分段混乱
POI批量替换world文档XWPFParagraph.getRuns 出现分段混乱
1068 1