爬虫—xpath用法

"""
__coding__ = 'UTF-8'
__author__ = 'bingo'
__date__ = '2020/8/21'
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
             ┏┓   ┏┓
            ┏┛┻━━━┛┻━━┓
            ┃    ☃    ┃
            ┃  ┳┛  ┗┳ ┃
            ┃     ┻   ┃
            ┗━┓     ┏━┛
              ┃     ┗━━━━━┓
              ┃  神兽保佑  ┣┓
              ┃ 永无BUG! ┏┛
              ┗━━━┓┓┏━━┳┓┏┛
                  ┃┫┫  ┃┫┫
                  ┗┻┛  ┗┻┛
"""
from lxml import etree
html_content = """
<div class="nav-items">
  <ul>
    <li  class="li li1" name="购票"><a href="https://movie.douban.com/cinema/nowplaying/">影讯&购票</a></li>
    <li  class="li li2"><a href="https://movie.douban.com/explore">选电影</a></li>
    <li  class="li li3"><a href="https://movie.douban.com/tv/">电视剧</a></li>
    <li  class="li li4"><a href="https://movie.douban.com/chart">排行榜</a></li>
    <li  class="li li5"><a href="https://movie.douban.com/tag/">分类</a></li>
    <li  class="li li6"><a href="https://movie.douban.com/review/best/">影评</a></li>
    <li  class="li li7"><a href="https://movie.douban.com/annual/2019?source=navigation">2019年度榜单</a></li>
    <li  class="li8"><a href="https://m.douban.com/standbyme/annual2019?source=navigation" target="_blank">2019书影音报告</a></li>
  </ul>
  <a href="www.baidu.com">百度一下,你就知道</a>
</div>
"""

# 初始化一个xpath对象
html = etree.HTML(html_content)

# 1、获取所有节点
a = html.xpath("//*")
print(a)
# >>> [<Element html at 0x1cac7ec3c88>, <Element body at 0x1cac7f27588>, <Element div at 0x1cac7f27dc8>,
# <Element ul at 0x1cac7f27e08>, <Element li at 0x1cac7f27e48>, <Element a at 0x1cac7f27448>,
# <Element li at 0x1cac7f27e88>, <Element a at 0x1cac7f27ec8>, <Element li at 0x1cac7f27f08>,
# <Element a at 0x1cac7f27248>, <Element li at 0x1cac7f27f48>, <Element a at 0x1cac7f27f88>,
# <Element li at 0x1cac7f27fc8>, <Element a at 0x1cac7f30048>, <Element li at 0x1cac7f30088>,
# <Element a at 0x1cac7f300c8>, <Element li at 0x1cac7f30108>, <Element a at 0x1cac7f30148>,
# <Element li at 0x1cac7f30188>, <Element a at 0x1cac7f301c8>]

# 2、获取所有a标签节点
b = html.xpath("//a")
print(b)
# >>> [<Element a at 0x1cac7f27448>, <Element a at 0x1cac7f27ec8>,
# <Element a at 0x1cac7f27248>, <Element a at 0x1cac7f27f88>,
# <Element a at 0x1cac7f30048>, <Element a at 0x1cac7f300c8>,
# <Element a at 0x1cac7f30148>, <Element a at 0x1cac7f301c8>]

# 3、获取直属子节点
c = html.xpath("//div/*")
print(c)
# >>> [<Element ul at 0x1cac7f27e08>]

# 4、获取子孙节点
d = html.xpath("//div//*")
print(d)
# >>> [<Element ul at 0x1cac7f27e08>, <Element li at 0x1cac7f27e48>, <Element a at 0x1cac7f27448>,
# <Element li at 0x1cac7f27e88>, <Element a at 0x1cac7f27ec8>, <Element li at 0x1cac7f27f08>,
# <Element a at 0x1cac7f27248>, <Element li at 0x1cac7f27f48>, <Element a at 0x1cac7f27f88>,
# <Element li at 0x1cac7f27fc8>, <Element a at 0x1cac7f30048>, <Element li at 0x1cac7f30088>,
# <Element a at 0x1cac7f300c8>, <Element li at 0x1cac7f30108>, <Element a at 0x1cac7f30148>,
# <Element li at 0x1cac7f30188>, <Element a at 0x1cac7f301c8>]

# 5、获取父节点
e1 = html.xpath("//ul/..")
e2 = html.xpath("//ul/parent::*")
print(e1)
print(e2)
# >>> [<Element div at 0x1e404d17d48>]
# >>> [<Element div at 0x1e404d17d48>]

# 6、属性匹配
f1 = html.xpath("//li[@class='li8']")             # 针对一个属性只有一个值
f2 = html.xpath("//li[contains(@class, 'li1')]")  # 针对一个属性对应多个值(contains)
f3 = html.xpath("//li[contains(@class, 'li') and @name='购票']/a/text()")    # 针对多属性匹配
print(f1)
print(f2)
print(f3)
# >>> [<Element li at 0x22ea0bc10c8>]
# >>> [<Element li at 0x22ea0bb8d88>]
# >>> ['影讯&购票']

# 7、属性获取
g1 = html.xpath("//li[@name='购票']/a/@href")
g2 = html.xpath("//li[@name='购票']/@class")
print(g1)
print(g2)
# >>> ['https://movie.douban.com/cinema/nowplaying/']
# >>> ['li li1']

# 8、文本获取
h = html.xpath("//li//text()")
print(h)
# >>> ['影讯&购票', '选电影', '电视剧', '排行榜', '分类', '影评', '2019年度榜单', '2019书影音报告']

# 9、按序选择
i1 = html.xpath("//li[1]/a/text()")                 # 选区第一个li
i2 = html.xpath("//li[last()]/a/text()")            # 选取最后一个li
i3 = html.xpath("//li[position()<4]/a/text()")      # 选取前3个
i4 = html.xpath("//li[last()-1]/a/text()")          # 选区倒数第二个li
print(i1)
print(i2)
print(i3)
print(i4)
# >>> ['影讯&购票']
# >>> ['2019书影音报告']
# >>> ['影讯&购票', '选电影', '电视剧']
# >>> ['2019年度榜单']

# 10、节点轴选择
"""
ancestor                    选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self            选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute                   选取当前节点的所有属性。
child                       选取当前节点的所有子元素。
descendant                  选取当前节点的所有后代元素(子、孙等)。
descendant-or-self          选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following                   选取文档中当前节点的结束标签之后的所有节点。
following-sibling           选取文档中当前节点的结束标签之后的所有同级节点。
parent                      选取当前节点的父节点。
preceding                   选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling           选取当前节点之前的所有同级节点。
self                        选取当前节点。
"""
j1 = html.xpath("//li[1][contains(@class, 'li')]/ancestor::*")              # 所有父辈以及祖辈元素
j2 = html.xpath("//li[1][contains(@class, 'li')]/ancestor-or-self::*")      # 所有父辈以及祖辈元素和当前节点
j3 = html.xpath("//li[1][contains(@class, 'li')]/attribute::*")             # 所有当前节点的属性值
j4 = html.xpath("//li[1][contains(@class, 'li')]/child::a/text()")          # 选取当前元素的子节点a
j5 = html.xpath("//li[1][contains(@class, 'li')]/descendant::*")            # 选取当前元素的子孙节点
j6 = html.xpath("//li[1][contains(@class, 'li')]/descendant-or-self::*")    # 选取当前元素的子孙节点以及当前节点
j7 = html.xpath("//li[1][contains(@class, 'li')]/following::a/text()")      # 选取当前节点结束标签后的所有节点
j8 = html.xpath("//li[1][contains(@class, 'li')]/following-sibling::*/a/text()")      # 选取当前节点结束标签后的所有同级节点
j9 = html.xpath("//li[3][contains(@class, 'li')]/preceding::*")      # 选取当前节点结束标签前的所有节点
j10 = html.xpath("//li[3][contains(@class, 'li')]/preceding-sibling::*")      # 选取当前节点结束标签前的所有同级节点
j11 = html.xpath("//li[1][contains(@class, 'li')]/parent::*")                # 选取当前节点的父节点
print("j1: %s" % j1)
print("j2: %s" % j2)
print("j3: %s" % j3)
print("j4: %s" % j4)
print("j5: %s" % j5)
print("j6: %s" % j6)
print("j7: %s" % j7)
print("j8: %s" % j8)
print("j9: %s" % j9)
print("j10: %s" % j10)
print("j11: %s" % j11)
# >>> j1: [<Element html at 0x1b91f34bf08>, <Element body at 0x1b91f3b7c08>, <Element div at 0x1b91f3b7c88>, <Element ul at 0x1b91f3b7a88>]
# >>> j2: [<Element html at 0x1b91f34bf08>, <Element body at 0x1b91f3b7c08>, <Element div at 0x1b91f3b7c88>, <Element ul at 0x1b91f3b7a88>, <Element li at 0x1b91f3b7b88>]
# >>> j3: ['li li1', '购票']
# >>> j4: ['影讯&购票']
# >>> j5: [<Element a at 0x1b91f3ba508>]
# >>> j6: [<Element li at 0x1b91f3b7b88>, <Element a at 0x1b91f3ba508>]
# >>> j7: ['选电影', '电视剧', '排行榜', '分类', '影评', '2019年度榜单', '2019书影音报告', '百度一下,你就知道']
# >>> j8: ['选电影', '电视剧', '排行榜', '分类', '影评', '2019年度榜单', '2019书影音报告']
# >>> j9: [<Element li at 0x1b91f3b7b88>, <Element a at 0x1b91f3ba508>, <Element li at 0x1b91f3ba548>, <Element a at 0x1b91f3ba588>]
# >>> j10: [<Element li at 0x1b91f3b7b88>, <Element li at 0x1b91f3ba548>]
# >>> j11: [<Element ul at 0x1b91f3b7a88>]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343