目前有很多xml,html文檔的parser,如標准庫的xml.etree , beautifulsoup , 還有lxml. 都用下來感覺lxml不錯,速度也還行,就他了.
圍繞三個問題:
- 問題1:有一個XML文件,如何解析
- 問題2:解析后,如果查找、定位某個標簽
- 問題3:定位后如何操作標簽,比如訪問屬性、文本內容等
這些操作應該算是比較基礎的,參考教程中文版,官網更詳細一點,進階xpath語法,要在以后操作xml文件和html文件用上.
#!/usr/bin/python # coding=utf-8 # __author__='dahu' # ''' Element是XML處理的核心類, Element對象可以直觀的理解為XML的節點,大部分XML節點的處理都是圍繞該類進行的。 這部分包括三個內容:節點的操作、節點屬性的操作、節點內文本的操作。 ''' from lxml import etree # 1.創建element root = etree.Element('root') print root, root.tag # 2.添加子節點 child1 = etree.SubElement(root, 'child1') child2 = etree.SubElement(root, 'child2') # 3.刪除子節點 # root.remove(child2) # 4.刪除所有子節點 # root.clear() # 5.以列表的方式操作子節點 print(len(root)) print root.index(child1) # 索引號 root.insert(0, etree.Element('child3')) # 按位置插入 root.append(etree.Element('child4')) # 尾部添加 # 6.獲取父節點 print(child1.getparent().tag) # print root[0].getparent().tag #用列表獲取子節點,再獲取父節點 '''以上都是節點操作''' # 7.創建屬性 # root.set('hello', 'dahu') #set(屬性名,屬性值) # root.set('hi', 'qing') # 8.獲取屬性 # print(root.get('hello')) #get方法 # print root.keys(),root.values(),root.items() #參考字典的操作 # print root.attrib #直接拿到屬性存放的字典,節點的attrib,就是該節點的屬性 '''以上是屬性的操作''' # 9.text和tail屬性 # root.text = 'Hello, World!' # print root.text # 10.test,tail和text的結合 html = etree.Element('html') html.text = 'html.text' body = etree.SubElement(html, 'body') body.text = 'wo ai ni' child = etree.SubElement(body, 'child') child.text='child.text' #一般情況下,如果一個節點的text沒有內容,就只有</>符號,如果有內容,才會<>,</>都有 child.tail = 'tails' # tail是在標簽后面追加文本 print(etree.tostring(html)) # print(etree.tostring(html, method='text')) # 只輸出text和tail這種文本文檔,輸出的內容連在一起,不實用 #11.Xpath方式 # print(html.xpath('string()')) #這個和上面的方法一樣,只返回文本的text和tail print(html.xpath('//text()')) #這個比較好,按各個文本值存放在列表里面 tt=html.xpath('//text()') print tt[0].getparent().tag #這個可以,首先我可以找到存放每個節點的text的列表,然后我再根據text找相應的節點 # for i in tt: # print i,i.getparent().tag,'\t', #12.判斷文本類型 print tt[0].is_text,tt[-1].is_tail #判斷是普通text文本,還是tail文本 '''以上都是文本的操作''' #13.字符串解析,fromstring方式 xml_data = '<html>html.text<body>wo ai ni<child>child.text</child>tails</body></html>' root1=etree.fromstring(xml_data) #fromstring,字面意思,直接來源字符串 # print root1.tag # print etree.tostring(root1) #14.xml方式 root2 = etree.XML(xml_data) #和fromstring基本一樣, print etree.tostring(root2) #15.文件類型解析 tree =etree.parse('text') #文件解析成元素樹 root3 = tree.getroot() #獲取元素樹的根節點 print etree.tostring(root3,pretty_print=True) parser= etree.XMLParser(remove_blank_text=True) #去除xml文件里的空行 root = etree.XML("<root> <a/> <b> </b> </root>",parser) print etree.tostring(root) #16.html方式 xml_data1='<root>data</root>' root4 = etree.HTML(xml_data1) print(etree.tostring(root4))#HTML方法,如果沒有<html>和<body>標簽,會自動補上 #注意,如果是需要補全的html格式:這樣處理哦 with open("quotes-1.html",'r')as f: a=H.document_fromstring(f.read().decode("utf-8")) for i in a.xpath('//div[@class="quote"]/span[@class="text"]/text()'): print i #17.輸出內容,輸出xml格式 print etree.tostring(root) print(etree.tostring(root, xml_declaration=True,pretty_print=True,encoding='utf-8'))#指定xml聲明和編碼 '''以上是文件IO操作''' #18.findall方法 root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>") print(root.findall('a')[0].text)#findall操作返回列表 print(root.find('.//a').text) #find操作就相當與找到了這個元素節點,返回匹配到的第一個元素 print(root.find('a').text) print [ b.text for b in root.findall('.//a') ] #配合列表解析,相當帥氣! print(root.findall('.//a[@x]')[0].tag) #根據屬性查詢 '''以上是搜索和定位操作''' print(etree.iselement(root)) print root[0] is root[1].getprevious() #子節點之間的順序 print root[1] is root[0].getnext() '''其他技能''' # 遍歷元素數 root = etree.Element("root") etree.SubElement(root, "child").text = "Child 1" etree.SubElement(root, "child").text = "Child 2" etree.SubElement(root, "another").text = "Child 3" etree.SubElement(root[0], "childson").text = "son 1" # for i in root.iter(): #深度遍歷 # for i in root.iter('child'): #只迭代目標值 # print i.tag,i.text # print etree.tostring(root,pretty_print=True)
