Lxml庫的使用:
1.修正HTML代碼
from lxml import etree
html=etree.HTML(text) #Lxml庫解析數(shù)據(jù)翩迈,為Element對象
result=etree.tostring(html) #此時(shí)可以自動(dòng)修正HTML代碼,補(bǔ)齊標(biāo)簽等等
2.讀取HTML文件
可以通過pycharm新建HTML文件盔夜,然后用代碼寫網(wǎng)頁
讀取本地的HTML文件使用parse()方法
from lxml import etree
html=etree.parse(r"文件路徑")
result=etree.tostring(html,pretty_print=True)
3.解析HTML文件
使用requests獲取HTML文件后负饲,村咋子res中
html=etree.HTML(res.text)
result=etree.tostring(html) #實(shí)現(xiàn)對其的解析
Xpath語法
<user>
<name>xiao ming</name>
<sex>man</sex>
<id>34</id>
<goal>89</goal>
</user>
1.父節(jié)點(diǎn)
每個(gè)元素及屬性都有一個(gè)父節(jié)點(diǎn),在上面的代碼中喂链,user元素是name返十、sex、id及goal元素的父節(jié)點(diǎn)椭微。
2.子節(jié)點(diǎn)
元素節(jié)點(diǎn)可有0個(gè)洞坑、一個(gè)或多個(gè)子節(jié)點(diǎn),在上面的代碼中蝇率,name迟杂、sex、id及goal元素都是user元素的子節(jié)點(diǎn)本慕。
3.同胞結(jié)點(diǎn)
同胞節(jié)點(diǎn)擁有相同的父節(jié)點(diǎn)排拷,在上面的代碼中,name锅尘、sex监氢、id及goal元素都是同胞節(jié)點(diǎn)
4.先輩結(jié)點(diǎn)
先輩節(jié)點(diǎn)指某節(jié)點(diǎn)的父、父的父節(jié)點(diǎn)等鉴象,在下面的例子中忙菠,name元素的先輩是user元素和user_database元素:
<user_database>
<user>
<name>xiao ming</name>
<sex>man</sex>
<id>34</id>
<goal>89</goal>
</user>
</user_database>
5.后代節(jié)點(diǎn)指某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)、子節(jié)點(diǎn)的子節(jié)點(diǎn)等纺弊,在下面的例子中,user_database的后代是user骡男、name淆游、sex、id及goal元素:
<user_database>
<user>
<name>xiao ming</name>
<sex>man</sex>
<id>34</id>
<goal>89</goal>
</user>
</user_database>
節(jié)點(diǎn)選擇
Xpath使用路徑表達(dá)式在XML文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過演著路徑或者step來選取的犹菱,如下表:
作者:OzanShareing
鏈接:http://www.reibang.com/p/8e3aff9919d4
來源:簡書
簡書著作權(quán)歸作者所有拾稳,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
使用技巧
從瀏覽器上檢查尋找腊脱,然后復(fù)制出xpath路徑访得,這就是某一個(gè)的,通過觀察對比得到所有的
//*[@id="qiushi_tag_121525160"]/div[1]/a[2]/h2
注意在后面加/text()提取文字信息陕凹,然后得到的是一個(gè)列表悍抑,用切片法得到內(nèi)容[0],再用strip()語法去掉換行符
用xpath爬取多個(gè)id信息
可以用:
1.id=selector.xpath('//div/div[1]/a[2]/h2/text()')
for i in id:
print(i.strip())
2.id=selector.xpath('//div[@class="article block untagged mb15 typs_hot"]/div[1]/a[2]/h2/text()')
for i in id:
print(i.strip())
有時(shí)候會(huì)遇到相同的字符開頭的多個(gè)標(biāo)簽:
<li class="tag-1">需要的內(nèi)容1</li>
<li class="tag-2">需要的內(nèi)容2</li>
<li class="tag-3">需要的內(nèi)容3</li>
想同時(shí)爬取時(shí)杜耙,不需要構(gòu)造多個(gè)Xpath路徑搜骡,通過starts-with()便可以獲取多個(gè)標(biāo)簽內(nèi)容。
如下:
starts-with()方法
contents = selector.xpath('//li[starts-with(@class,"tag")]/text() ')
string(.)方法
當(dāng)遇到標(biāo)簽套標(biāo)簽情況時(shí):
<div class="red">需要的內(nèi)容1
<h1>需要的內(nèi)容2</h1>
</div>>
想同時(shí)獲取文本內(nèi)容佑女,可以通過string(.)完成:
from lxml import etree
html2 = '''
<div class="red">需要的內(nèi)容1
<h1>需要的內(nèi)容2</h1>
</div>>
'''
selector = etree.HTML(html2)
content1 = selector.xpath('//div[@class="red"]')[0]
content2 = content1.xpath('string(.)')
print(content2)