欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫学习第三章-4.1.2-xpath解析基础代码

程序员文章站 2022-05-07 23:31:40
...

Python爬虫学习第三章-4.1.2-xpath解析基础代码

  这一节主要是编写代码熟悉一下xpath的基础内容

html文件源代码为:

<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>测试bs4</title>
</head>
<body>
    <div>
        <p>百里守约</p>
    </div>
    <div class="song">
        <p>李清照</p>
        <p>王安石</p>
        <p>苏轼</p>
        <p>柳宗元</p>
        <a href="http://www.song.com/" title="赵匡胤" target="_self">
            <span>this is span</span>
            宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
        <a href="" class="du">总为浮云能避日,长安不见使人愁</a>
        <img src="http://www.baidu.com/meinv.jpg" alt="" />
    </div>
    <div class="tang">
        <ul>
            <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a> </li>
            <li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还</a> </li>
            <li><a href="http://www.126.com" title="qi">歧王宅里寻常见,崔九堂前几度闻</a> </li>
            <li><a href="http://www.sina.com" title="du">杜甫</a> </li>
            <li><a href="http://www.dudu.com" title="du">杜牧</a> </li>
            <li><b>杜小月</b></li>
            <li><i>度蜜月</i></li>
            <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流</a></li>
        </ul>
    </div>
</body>
</html>

xpath方法的演示如下:

from lxml import etree
import requests
if __name__=="__main__":
    #先实例化一个etree对象,然后调用etree对象中的xpath函数,将不同形式的xpath表达式作用到xpath表达式中,从而进行相关数据的解析和提取
    #实例化好了一个etree对象,并将被解析的源码数据加载到该对象中。
    tree = etree.parse('test.html')
    #调用xpath方法,返回的是一个列表,xpath表达式是通过层级关系进行标签的定位,这里我们想用xpath表达式定位到title标签
    r = tree.xpath('/html/head/title')#html前面加个斜线是指从根节点(根目录)开始遍历的,中间的/表示一个层级
    print(r)  #返回的是一个列表,里面的元素是一个包含标签内容的Element类型的对象[<Element title at 0x1dcaedc6688>]
    #输出:[<Element title at 0x25ce42e6888>]

    #获取body下面的div标签
    t = tree.xpath('/html/body/div')
    print(t) #返回的列表中是三个包含标签数据的element类型的对象
    # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>]

    e = tree.xpath('/html//div')  #两个//表示的是多个层级,相当都bs4中的空格,/就相当于bs4中>
    print(e)
    # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>]

    a = tree.xpath('//div')#从任意位置找div标签,也就是找html文件中的所有div标签
    print(a)
    # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>]

    b = tree.xpath('//div[@class="song"]')  #//div指获取所有的div标签,用[@class="song"]来进行限制就可以通过属性定位,@后边是属性名称
    print(b)
    # 输出:[<Element div at 0x25ce42e6948>]

    #定位到body下面,class属性值为song的div标签中的第三个p标签<p>苏轼</p>,也就是索引定位
    c = tree.xpath('//div[@class="song"]/p[3]') #注意索引是从1开始的
    print(c)
    # 输出:[<Element p at 0x25ce42eefc8>]

    d = tree.xpath('//div[@class="tang"]/ul/li[5]/a')
    print(d)
    # 输出:[<Element a at 0x25ce4306708>]
    #
    d_List_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()') #在最后加个text()就可以取到内容
    print(d_List_text)
    # 输出:['杜牧']
    #
    d_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()')[0]  # 在最后加个text()就可以取到内容
    print(d_text)
    # 输出:杜牧

    f = tree.xpath('//li[7]/i/text()')
    print(f)
    # 输出:['度蜜月']

    g = tree.xpath('//div[@class="tang"]//text()') #//text() 获取的是标签中非直系的文本内容(也就是标签中所有的文本内容)
    print(g)
    # 输出:['\n        ', '\n            ', '清明时节雨纷纷,路上行人欲断魂', ' ', '\n            ', '秦时明月汉时关,万里长征人未还', ' ', '\n            ', '歧王宅里寻常见,崔九堂前几度闻', ' ', '\n            ', '杜甫', ' ', '\n            ', '杜牧', ' ', '\n            ', '杜小月', '\n            ', '度蜜月', '\n            ', '凤凰台上凤凰游,凤去台空江自流', '\n        ', '\n    ']

    #取属性:取img当中的src属性值
    h = tree.xpath('//div[@class="song"]/img/@src')  #取属性值可以是/@属性名称
    print(h)
    # 输出:['http://www.baidu.com/meinv.jpg']

相关标签: 爬虫 python