必備知識點
- 在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
屬於標簽,它有自己的屬性,例如class
、id
等等。 - 點 . 的作用:表示當前位置;與其對應的是雙點 .. :表示上一層級的位置 - 雙斜杠 // 的作用:查找當前標簽下所有子級中搜索;與其對應的是單斜桿 / ,這個標簽標簽下一層所有中搜索。【后面兩個任務是這點的練習】
任務二:獲取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
下,所有類為three
的div
標簽的文本值
指定id為second,並且子級div的類名是three,然后是獲取文本,則xpath如下
print(html.xpath('.//div[@id="second"]/div[@class="three"]/text()'))
結果:['水電費', '說的話房間不開封']
任務五:獲取所有類為three
的div
標簽的文本值
觀察html代碼塊,會發現類為three
的div
標簽在幾個地方,所以這里最好的方法就是全局范圍內的直接搜索,簡單粗暴的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'))