requests+xpath的使用


這個例子是抓取禪道-組織-用戶列表里的數據。使用xpath抓取數據,非常的高效,只需要復制出列表中元素的xpath就可以准確定位。

 

 

1、 首先找出員工列表中“001”、“admin”、“002”的xpath

“001” xpath:    /html/body/div[1]/div[1]/div[4]/form/table/tbody/tr[1]/td[1]/input

“admin” xpath:/html/body/div[1]/div[1]/div[4]/form/table/tbody/tr[1]/td[2]/a

“002” xpath:   /html/body/div[1]/div[1]/div[4]/form/table/tbody/tr[2]/td[1]/input

分析得出,整個列表的元素公用的xpath為: /html/body/div[1]/div[1]/div[4]/form/table/tbody/tr

2、將響應的text屬性值取出,使用 etree.HTML(text) 將字符串格式的 html 片段解析成 html 文檔。

3、取出第一列元素的相對路徑,作為item.xpath的參數,就取出第一列元素。將i1打印出來,發現並不是我們需要的值,可以設置斷點調試,看到i1[0]的tail屬性(i1[0].tail)才是我們需要的第一列“ID”的值。

 

4、同步驟3,可知i2[0].text是我們需要取得第二列“真實姓名”的值。但如果該列值為空的話,‘td[2/a]’路徑就變成‘td[2]’,相對路徑就是錯誤的,程序會出錯。代碼做如下處理:

i2 = item.xpath('td[2]/a')        
if i2 ==[]:
     i2=item.xpath('td[2]')

5、實現代碼如下:

from lxml import etree
import requests
from requests.auth import HTTPBasicAuth
from requests.exceptions import RequestException


def get_url(url):
try:
b = requests.post(url, auth=HTTPBasicAuth('xxxxx', yyyyyy))#xxxxx為禪道登錄的用戶名 yyyyyy 為禪道登錄的密碼
if b.status_code == 200:
return b.text
return b.status_code
except RequestException:
return None


def get_text(html):
tree = etree.HTML(html)
xp = '/html/body/div[1]/div[1]/div[4]/form/table/tbody/tr'
nodetitle = tree.xpath(xp)
print(nodetitle)

for item in nodetitle:

i1 = item.xpath('td[1]/input') #取出第一列的值(ID)
print(i1[0].tail)
     i2 = item.xpath('td[2]/a') #取出第二列的值(真實姓名)
if i2 ==[]:
       i2=item.xpath('td[2]')
print(i2[0].text)


def main():
url = 'http://39.106.90.48:9000/zentao/company-browse.html'
html = get_url(url)
t = get_text(html)
print(t)


if __name__ == '__main__':
main()

6、如果我們想得到其他列的值,可以參考步驟3、4來獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM