1. 程式人生 > >xpath 通過ID和Class檢索

xpath 通過ID和Class檢索

request @class 最終 都市 們的 con 直接 path 水電費

必備知識點

  • 在html中,id是唯一的
  • 在html中,class是可以多處引用的

工具

  • Python3版本
  • lxml庫【優點是解析快】
  • HTML代碼塊【從網絡中獲取或者自己杜撰一個】
  • requests【推薦安裝,從網頁上獲取網頁代碼練手,再好不過了】

Xpath學習

先定義html代碼塊【這次只從body開始】

<body>
<div class="container">
    <div id="first">
        <div class="one">都市</div>
        <div class="two">德瑪西亞</div>
        <div class="two">王牌對王牌</div>
        <a>
            <div class="spe">特殊位置</div>
        </a>
    </div>
    <div id="second">
        <div class="three">水電費</div>
        <div class="three">說的話房間不開封</div>
        <div class="four">三頓飯黑客技術</div>
    </div>
    <div id="third">
        <div class="three">水電費</div>
        <div class="three">說的話房間開封</div>
    </div>
</div>
</body>
"""

再準備python代碼塊

from lxml import etree

html = etree.HTML(html_str)

任務一:獲取類名為one的文本值

解決這個問題,有非常簡單的xpath路徑,直接匹配html代碼中的class,然後獲取文本值就行

代碼如下:

print(html.xpath(‘.//div[@class="one"]/text()‘))

結果:[‘都市‘]

這裏需要解釋多個地方: - @的作用:表示屬性,div屬於標簽,它有自己的屬性,例如classid等等。 - 點 . 的作用:表示當前位置;與其對應的是雙點 .. :表示上一層級的位置 - 雙斜杠 // 的作用:查找當前標簽下所有子級中搜索;與其對應的是單斜桿 / ,這個標簽標簽下一層所有中搜索。【後面兩個任務是這點的練習】

任務二:獲取id為first下,第一層子級div標簽的文本值

只需要獲取第一層,使用單斜桿就足夠了,xpath路徑如下:

print(html.xpath(‘.//div[@id="first"]/div/text()‘))

結果:[‘都市‘, ‘德瑪西亞‘, ‘王牌對王牌‘]

任務三:獲取id為first下,所有層級div標簽的文本值

這個任務和上一個任務形成對比,一個是單斜桿一個是雙斜杠,則xpath的代碼如下:

print(html.xpath(‘.//div[@id="first"]//div/text()‘))

結果:[‘都市‘, ‘德瑪西亞‘, ‘王牌對王牌‘, ‘特殊位置‘]

任務四:獲取id為second
下,所有類為threediv標簽的文本值

指定id為second,並且子級div的類名是three,然後是獲取文本,則xpath如下

print(html.xpath(‘.//div[@id="second"]/div[@class="three"]/text()‘))

結果:[‘水電費‘, ‘說的話房間不開封‘]

任務五:獲取所有類為threediv標簽的文本值

觀察html代碼塊,會發現類為threediv標簽在幾個地方,所以這裏最好的方法就是全局範圍內的直接搜索,簡單粗暴的xpath如下:

print(html.xpath(‘.//div[@class="three"]/text()‘))

結果:[‘水電費‘, ‘說的話房間不開封‘, ‘水電費‘, ‘說的話房間開封‘]

任務六:獲取文本等於水電費的標簽,取出他們的class

通過文本值,獲取他們的類名信息,就是把上一個任務反過來做就行,xpath如下:

print(html.xpath(‘.//div[text()="水電費"]/@class‘))

結果:[‘three‘, ‘three‘]

最終的代碼和運行截圖

html_str = """
<body>
<div class="container">
    <div id="first">
        <div class="one">都市</div>
        <div class="two">德瑪西亞</div>
        <div class="two">王牌對王牌</div>
        <a>
            <div class="spe">特殊位置</div>
        </a>
    </div>
    <div id="second">
        <div class="three">水電費</div>
        <div class="three">說的話房間不開封</div>
        <div class="four">三頓飯黑客技術</div>
    </div>
    <div id="third">
        <div class="three">水電費</div>
        <div class="three">說的話房間開封</div>
    </div>
</div>
</body>
"""

from lxml import etree

html = etree.HTML(html_str)
print(html.xpath(‘.//div[@class="one"]/text()‘))
print(html.xpath(‘.//div[@id="first"]/div/text()‘))
print(html.xpath(‘.//div[@id="first"]//div/text()‘))
print(html.xpath(‘.//div[@id="second"]/div[@class="three"]/text()‘))
print(html.xpath(‘.//div[@class="three"]/text()‘))
print(html.xpath(‘.//div[text()="水電費"]/@class‘))

技術分享圖片

版權聲明:允許轉載,轉載請註明出處 —— 《xpath教程》: 通過ID和Class檢索

xpath 通過ID和Class檢索