网页解析_xpath-02

发布时间 2023-11-17 14:30:35作者: 人生努力努力努力就好

第一部分:简介

原理跟soup一样,都是把html字符串转换成标签对象,像选择路径一样选择标签。

 第二部分:代码块

1:公共代码部分

from lxml import etree  # 导包   
<html>
<head>
<title>爬虫</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="http://www.taobao.com">
  <link rel="stylesheet" href="https://www.baidu.com">
  <link rel="stylesheet" href="http://at.alicdn.com/t/font_684044_un7umbuwwfp.css">
</head>
<body>
<!-- footer start -->
<footer id="footer">
    <div class="footer-box">
        <div class="footer-content"  >
            <p class="top-content"  id="111">
                    <a  href="http://www.taobao.com">淘宝</a> 
                    <span class="link">
						<a class="product"  href="https://www.baidu.com">关于Python</a> 
						<a  href="http://www.taobao.com">好好学习</a> 
						<a href="javascript:void(0)">人生苦短</a> 
						<a href="javascript:void(0)">我用Python</a>
					</span>
                <span class="about-me">关于我: <i class="PyWhich py-wechat"></i> 忽略</span>
            </p>
            <p class="bottom-content">
                # <a href="https://www.xiaoxa" id=25>xiaogan</a>
                <span>地址: xxxx</span>
                <span>联系方式: <a href="tel:400-1567-315">400-1567-315</a> (24小时在线)</span>
            </p>
        </div>
        <p class="copyright-desc">
            Copyright © 爬虫有限公司. All Rights Reserved
        </p>
    </div>
</footer>

</body>
</html>
"""

2:主要代码块 

page=etree.HTML(html_str)  #
print(page) # <Element html at 0x183fc16dc08>
print(type(page)) # <class 'lxml.etree._Element'>
print(page.xpath('/html')) # [<Element html at 0x18bfcd43c08>] 从跟节点选择
print(page.xpath('/p')) # []
# 1.标签与属性的选择
print(page.xpath('/html/body/footer')) # /:一级级选择 [<Element footer at 0x2835b023b48>]
print(page.xpath('/html/body/p')) # /:从路径开始,一级级选择 [] p不是下一级
print(page.xpath('//p')) # 获取所有p标签,不限位置
# [<Element p at 0x1db29126b88>, <Element p at 0x1db29126bc8>, <Element p at 0x1db29126c88>]
print(page.xpath('//p')[0]) # 获取所有p标签,不限位置
# <Element p at 0x1e491e46b88>
p=page.xpath('//p')[0]
print(p.xpath('./a')) # .当前标签 获取第一个a [<Element a at 0x24a055f6c88>]
print(p.xpath('.//a')) # .当前标签 //获取所有a
# [<Element a at 0x20f760d6c88>, <Element a at 0x20f760d6bc8>,
# <Element a at 0x20f760d6cc8>, <Element a at 0x20f760d6d08>, <Element a at 0x20f760d6d48>]
print(p.xpath('.//a')) # .当前标签 //获取所有a <Element a at 0x2b7d07f6d88>
print(p.xpath('./span')) # .当前标签 //获取所有 [<Element span at 0x2b7d07f6d88>, <Element span at 0x2b7d07f6c88>]
print(p.xpath('.//a')[0]) # .当前标签 //获取所有a <Element a at 0x1b23d0a6d48>
a=p.xpath('.//a')[0]
print(a.xpath('..')) # 选取当前节点的父节点 为p [<Element p at 0x256d18c6b88>]
# nodename 选取当前节点的所有nodename子节点
print(page.xpath('body')) # [<Element body at 0x263305c6cc8>]
#
print(p.xpath('a')) # [<Element a at 0x2cae1256d48>]
print('======================================================')
# 2.
p=page.xpath('//p') # 如果要选择指定的p怎么办?根据属性
print(p)
# [<Element p at 0x20f22746b88>, <Element p at 0x20f22746cc8>, <Element p at 0x20f22746d88>]
# < p
# class ="top-content" id="111" >
print(page.xpath('//p[@class="top-content"]')) # [<Element p at 0x1c006aa6b88>]
print(page.xpath('//p[@class="top-content"]/@id')) # 很常用 ['111']
print(page.xpath('//p/*')) # 选取p元素的所有子元素 * 匹配任何元素节点
print(page.xpath('//p/@*')) # @* 匹配任何属性节点 @*:所有p标签下的属性
# 获取所有的属性: ['top-content', '111', 'bottom-content', 'copyright-desc']
# print(page.xpath('//*')) # 获取所有元素
#
print(page.xpath('//p[@class="top-content"]/a')) # 跟下面相同的 列表是从0开始
# [<Element a at 0x23d90566d48>]
print(page.xpath('//p[@class="top-content"]/a')[0]) # <Element a at 0x1ab226e7d48>
print(page.xpath('//p[@class="top-content"]/a[1]')) # 相同的 如果在xpath里进行索引选择 是从1开始
# [<Element a at 0x1ab226e7d48>]
print('===================================================')
print(page.xpath('//p[@class="top-content"]/a[last()]')) # 待? [<Element a at 0x1d2d49a6d48>]
# 3.获取文本
# 用text()获取某个节点下的文本
# 如果在源码增加<a href="https://www.xiaoxa" id=25>xiaogan</a>
contents=page.xpath('//p//a/text()') # 获取/所有p下的所有a元素 拿到的是列表
print(contents) # ['淘宝', '关于Python', '好好学习', '人生苦短', '我用Python', '400-1567-315']
# 用string()获取某个节点下所有的文本
contents1=page.xpath('string(//p)') # 拿到一个p的内容
print(contents1)
print(page.xpath('string(//body)')) # 如果想拿更多内容把范围选大一些
# print(page.xpath('string(//html)')) # 这种方式拿数据不好