基於lxml.etree實現xpath查找HTML元素
By:授客 QQ:1033553122
#實踐環境
WIN 10
Python 3.6.5
lxml-4.6.2-cp36-cp36m-win_amd64.whl
#實踐代碼
#!/usr/bin/env python # -*- coding:utf-8 -*- from lxml import etree html_str = '''<html> <body> <table width="400" border="1"> <tr> <th align="left">消費項目....</th> <th align="right">一月</th> <th align="right">二月</th> </tr> <tr> <td align="left">衣服</td> <td align="right">$241.10</td> <td align="right">$50.20</td> </tr> <tr> <td align="left">化妝品</td> <td align="right">$30.00</td> <td align="right">$44.45</td> </tr> <tr> <td align="left">食物</td> <td align="right">$730.40</td> <td align="right">$650.00</td> </tr> <tr> <th align="left">總計</th> <th align="right">$1001.50</th> <th align="right">$744.65</th> </tr> </table> </body> </html> ''' root_node = etree.HTML(html_str) # 解析HTML字符串,並返回HTML根結點 print('根節節點名稱為:%s' % root_node.tag) # 輸出 html # 查找根節點 print(root_node.xpath('/html')) # 輸出 <Element html at 0x17245dc8508>] tr_element_list = root_node.xpath("//table/tr[2]/td") # 獲取table元素節點下,第二個tr元素節點下的所有td元素 for element in tr_element_list: print(element.tag, element.text) /* for循環輸出如下 td 衣服 td $241.10 td $50.20 */ etree.tostring(root_node, encoding='utf-8').decode('utf-8') ## 輸出節點內容 second_tr = root_node.xpath('//table/tr[2]')[0] # 獲取table元素節點下,第二個tr元素節點 print(etree.tostring(second_tr, encoding='utf-8').decode('utf-8')) ## 輸出節點內容 /* <tr> <td align="left">衣服</td> <td align="right">$241.10</td> <td align="right">$50.20</td> </tr> */ # 注意:etree.tostring返回結果為字節對象 print(etree.tostring(second_tr)) ## 輸出以下內容 /* b'<tr>\n <td align="left">衣服</td>\n <td align="right">$241.10</td>\n <td align="right">$50.20</td>\n </tr>\n ' */ print(etree.tostring(second_tr).decode('utf-8')) # 輸出以下內容 /* <tr> <td align="left">衣服</td> <td align="right">$241.10</td> <td align="right">$50.20</td> </tr> */
#參考連接
https://lxml.de/tutorial.html#the-element-class
https://lxml.de/tutorial.html#the-xml-function