0%

python爬虫实例之Xpath使用

xpath是什么

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。

xpath练习

标签定位,取属性值
举例:用法还算简单,使用Xpath Helper练习XPath语法。无非就是定位标签,获取属性值或者文本内容。
image.png
image.png
image.png

应用场景-将提取数据对应组成字典

比如我需要把每部电影的title和region对应起来组成一个字典,可以这样做。

  • 用etree方法把html转换为element对象
  • 用xpath对这个element对象进行分组,分组的结果也是一个element对象
  • 对element对象进行遍历,获取title和region这两个字段的数据,就对这个element对象做xpath。这样可以确保字典的对应关系是正确的。
    代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    from lxml import etree #导入lxml模块的etree库

    text = '''
    <ul class="lists">
    <li id="26871938" class="list-item" data-title="灭绝" data-score="5.6" data-star="30" data-release="2018" data-duration="93分钟(中国大陆)" data-region="美国" data-director="本·扬" data-actors="迈克尔·佩纳 / 丽兹·卡潘 / 伊瑟尔·布罗萨德" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="7958" data-subject="26871938">
    <ul class="">
    <li class="poster">
    <a href="https://movie.douban.com/subject/26871938/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
    <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2579512247.webp" alt="灭绝" rel="nofollow" class="">
    </a>
    </li>
    <li class="stitle">
    <a href="https://movie.douban.com/subject/26871938/?from=playing_poster" class="ticket-btn" target="_blank" title="灭绝" data-psource="title">
    灭绝
    </a>
    </li>


    <li class="srating">
    <span class="rating-star allstar30"></span>
    <span class="subject-rate">5.6</span>
    </li>
    <li class="sbtn">
    <a class="ticket-btn" href="https://movie.douban.com/ticket/redirect/?movie_id=26871938" target="_blank">
    选座购票
    </a>
    </li>
    </ul>
    </li>
    <li id="25842038" class="list-item" data-title="理查德·朱维尔的哀歌" data-score="8.3" data-star="45" data-release="2019" data-duration="131分钟" data-region="美国" data-director="克林特·伊斯特伍德" data-actors="保罗·沃尔特·豪泽 / 山姆·洛克威尔 / 奥利维亚·王尔德" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="24174" data-subject="25842038">
    <ul class="">
    <li class="poster">
    <a href="https://movie.douban.com/subject/25842038/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
    <img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2578705064.webp" alt="理查德·朱维尔的哀歌" rel="nofollow" class="">
    </a>
    </li>
    <li class="stitle">
    <a href="https://movie.douban.com/subject/25842038/?from=playing_poster" class="ticket-btn" target="_blank" title="理查德·朱维尔的哀歌" data-psource="title">
    理查德·朱维尔...
    </a>
    </li>


    <li class="srating">
    <span class="rating-star allstar45"></span>
    <span class="subject-rate">8.3</span>
    </li>
    <li class="sbtn">
    <a class="ticket-btn" href="https://movie.douban.com/ticket/redirect/?movie_id=25842038" target="_blank">
    选座购票
    </a>
    </li>
    </ul>
    </li>
    <li id="30176393" class="list-item" data-title="误杀" data-score="7.7" data-star="40" data-release="2019" data-duration="112分钟" data-region="中国大陆" data-director="柯汶利" data-actors="肖央 / 谭卓 / 陈冲" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="363824" data-subject="30176393">
    <ul class="">
    <li class="poster">
    <a href="https://movie.douban.com/subject/30176393/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
    <img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2576090251.webp" alt="误杀" rel="nofollow" class="">
    </a>
    </li>
    <li class="stitle">
    <a href="https://movie.douban.com/subject/30176393/?from=playing_poster" class="ticket-btn" target="_blank" title="误杀" data-psource="title">
    误杀
    </a>
    </li>
    '''

    html = etree.HTML(text)
    # print(html) #结果是elment对象

    # html_str = etree.tostring(html).decode() #自动修正html代码。假设我漏写了其中一个</li>,这个方法会帮我们补全标签
    # print(html_str)

    title = html.xpath("//li[@class='list-item']/@data-title")
    region = html.xpath("//li[@class='list-item']/@data-region")
    print(title)
    print(region)

    grp = html.xpath("//li[@class='list-item']")
    print(grp) #这是个element对象

    for i in grp: #遍历elment对象,将title和region这两个列表组成字典
    item = {} #创建空字典,用于填充数据
    item["title"] = i.xpath("./@data-title")
    item["region"] = i.xpath("./@data-region")
    print(item)

总结

  • lxml模块的etree.HTML这个方法可以把html转换为element对象,我们可以对element对象使用xpath提取数据。
  • 把element对象分组再xpath这种方式(第一次xpath:把element对象分成更小的element对象;第二次xpath:从element对象中提取目标数据),可以帮助我们组成一个对应关系完全正确的字典
-------------本文结束感谢您的阅读-------------