精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入解讀Python解析XML的幾種方式

開發 后端
本文將介紹深入解讀利用Python語言解析XML文件的幾種方式,并以筆者推薦使用的ElementTree模塊為例,演示具體使用方法和場景。文中所使用的Python版本為2.7。

 

[[162832]]

在XML解析方面,Python貫徹了自己“開箱即用”(batteries included)的原則。在自帶的標準庫中,Python提供了大量可以用于處理XML語言的包和工具,數量之多,甚至讓Python編程新手無從選擇。

本文將介紹深入解讀利用Python語言解析XML文件的幾種方式,并以筆者推薦使用的ElementTree模塊為例,演示具體使用方法和場景。文中所使用的Python版本為2.7。

什么是XML?

XML是可擴展標記語言(Extensible Markup Language)的縮寫,其中的 標記(markup)是關鍵部分。您可以創建內容,然后使用限定標記標記它,從而使每個單詞、短語或塊成為可識別、可分類的信息。

 

[[162833]]

標記語言從早期的私有公司和政府制定形式逐漸演變成標準通用標記語言(Standard Generalized Markup Language,SGML)、超文本標記語言(Hypertext Markup Language,HTML),并且最終演變成 XML。XML有以下幾個特點。

  • XML的設計宗旨是傳輸數據,而非顯示數據。

  • XML標簽沒有被預定義。您需要自行定義標簽。

  • XML被設計為具有自我描述性。

  • XML是W3C的推薦標準。

目前,XML在Web中起到的作用不會亞于一直作為Web基石的HTML。 XML無所不在。XML是各種應用程序之間進行數據傳輸的最常用的工具,并且在信息存儲和描述領域變得越來越流行。因此,學會如何解析XML文件,對于Web開發來說是十分重要的。

 

有哪些可以解析XML的Python包?

Python的標準庫中,提供了6種可以用于處理XML的包。

xml.dom

xml.dom實現的是W3C制定的DOM API。如果你習慣于使用DOM API或者有人要求這這樣做,可以使用這個包。不過要注意,在這個包中,還提供了幾個不同的模塊,各自的性能有所區別。

 

DOM解析器在任何處理開始之前,必須把基于XML文件生成的樹狀數據放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大小。

xml.dom.minidom

xml.dom.minidom是DOM API的極簡化實現,比完整版的DOM要簡單的多,而且這個包也小的多。那些不熟悉DOM的朋友,應該考慮使用xml.etree.ElementTree模塊。據lxml的作者評價,這個模塊使用起來并不方便,效率也不高,而且還容易出現問題。

xml.dom.pulldom

與其他模塊不同,xml.dom.pulldom模塊提供的是一個“pull解析器”,其背后的基本概念指的是從XML 流中pull事件,然后進行處理。雖然與SAX一樣采用事件驅動模型(event-driven processing model),但是不同的是,使用pull解析器時,使用者需要明確地從XML流中pull事件,并對這些事件遍歷處理,直到處理完成或者出現錯誤。

pull解析(pull parsing)是近來興起的一種XML處理趨勢。此前諸如SAX和DOM這些流行的XML解析框架,都是push-based,也就是說對解析工作的控制權,掌握在解析器的手中。

xml.sax

 

[[162836]]

xml.sax模塊實現的是SAX API,這個模塊犧牲了便捷性來換取速度和內存占用。SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標準。它是事件驅動的,并不需要一次性讀入整個文檔,而文檔的讀入過程也就是SAX的解析過程。所謂事件驅 動,是指一種基于回調(callback)機制的程序運行方法。

xml.parser.expat

xml.parser.expat提供了對C語言編寫的expat解析器的一個直接的、底層API接口。expat接口與SAX類似,也是基于事件回調機制,但是這個接口并不是標準化的,只適用于expat庫。

expat是一個面向流的解析器。您注冊的解析器回調(或handler)功能,然后開始搜索它的文檔。當解析器識別該文件的指定的位置,它會調用 該部分相應的處理程序(如果您已經注冊的一個)。該文件被輸送到解析器,會被分割成多個片斷,并分段裝到內存中。因此expat可以解析那些巨大的文件。

xml.etree.ElementTree(以下簡稱ET)

 

xml.etree.ElementTree模塊提供了一個輕量級、Pythonic的API,同時還有一個高效的C語言實現,即xml.etree.cElementTree。與DOM相比,ET的速度更快,API使用更直接、方便。與SAX相比,ET.iterparse函數同樣提供了按需解析的功能,不會一次性在內存中讀入整個文檔。ET的性能與SAX模塊大致相仿,但是它的API更加高層次,用戶使用起來更加便捷。

筆者建議,在使用Python進行XML解析時,***使用ET模塊,除非你有其他特別的需求,可能需要另外的模塊來滿足。

解析XML的這幾種API并不是Python***的,Python也是通過借鑒其他語言或者直接從其他語言引入進來的。例如expat就是一個用C 語言開發的、用來解析XML文檔的開發庫。而SAX最初是由DavidMegginson采用java語言開發的,DOM可以以一種獨立于平臺和語言的方 式訪問和修改一個文檔的內容和結構,可以應用于任何編程語言。

下面,我們以ElementTree模塊為例,介紹在Python中如何解析lxml。

利用ElementTree解析XML

Python標準庫中,提供了ET的兩種實現。一個是純Python實現的xml.etree.ElementTree,另一個是速度更快的C語言實現xml.etree.cElementTree。請記住始終使用C語言實現,因為它的速度要快很多,而且內存消耗也要少很多。如果你所使用的Python版本中沒有cElementTree所需的加速模塊,你可以這樣導入模塊:

  1. try
  2.     import xml.etree.cElementTree as ET 
  3. except ImportError: 
  4.     import xml.etree.ElementTree as ET 

如果某個API存在不同的實現,上面是常見的導入方式。當然,很可能你直接導入***個模塊時,并不會出現問題。請注意,自Python 3.3之后,就不用采用上面的導入方法,因為ElemenTree模塊會自動優先使用C加速器,如果不存在C實現,則會使用Python實現。因此,使用Python 3.3+的朋友,只需要import xml.etree.ElementTree即可。

將XML文檔解析為樹(tree)

我們先從基礎講起。XML是一種結構化、層級化的數據格式,最適合體現XML的數據結構就是樹。ET提供了兩個對象:ElementTree將整個XML文檔轉化為樹,Element則代表著樹上的單個節點。對整個XML文檔的交互(讀取,寫入,查找需要的元素),一般是在ElementTree層面進行的。對單個XML元素及其子元素,則是在Element層面進行的。下面我們舉例介紹主要使用方法。

我們使用下面的XML文檔,作為演示數據:

  1. <xml version="1.0"?> 
  2. <doc> 
  3.     <branch name="codingpy.com" hash="1cdf045c"
  4.         text,source 
  5.     </branch> 
  6.     <branch name="release01" hash="f200013e"
  7.         <sub-branch name="subrelease01"
  8.             xml,sgml 
  9.         </sub-branch> 
  10.     </branch> 
  11.     <branch name="invalid"
  12.     </branch> 
  13. </doc> 

接下來,我們加載這個文檔,并進行解析:

  1. >>> import xml.etree.ElementTree as ET 
  2. >>> tree = ET.ElementTree(file='doc1.xml'

然后,我們獲取根元素(root element):

  1. >>> tree.getroot() 
  2. <Element 'doc' at 0x11eb780

正如之前所講的,根元素(root)是一個Element對象。我們看看根元素都有哪些屬性:

  1. >>> root = tree.getroot() 
  2. >>> root.tag, root.attrib 
  3. ('doc', {}) 

沒錯,根元素并沒有屬性。與其他Element對象一樣,根元素也具備遍歷其直接子元素的接口:

  1. >>> for child_of_root in root: 
  2. ...   print child_of_root.tag, child_of_root.attrib 
  3. ... 
  4. branch {'hash''1cdf045c''name''codingpy.com'
  5. branch {'hash''f200013e''name''release01'
  6. branch {'name''invalid'

我們還可以通過索引值來訪問特定的子元素:

  1. >>> root[0].tag, root[0].text 
  2. ('branch''\n        text,source\n    '

查找需要的元素

從上面的示例中,可以明顯發現我們能夠通過簡單的遞歸方法(對每一個元素,遞歸式訪問其所有子元素)獲取樹中的所有元素。但是,由于這是十分常見的工作,ET提供了一些簡便的實現方法。

Element對象有一個iter方法,可以對某個元素對象之下所有的子元素進行深度優先遍歷(DFS)。ElementTree對象同樣也有這個方法。下面是查找XML文檔中所有元素的最簡單方法:

  1. >>> for elem in tree.iter(): 
  2. ...   print elem.tag, elem.attrib 
  3. ... 
  4. doc {} 
  5. branch {'hash''1cdf045c''name''codingpy.com'
  6. branch {'hash''f200013e''name''release01'
  7. sub-branch {'name''subrelease01'
  8. branch {'name''invalid'

在此基礎上,我們可以對樹進行任意遍歷——遍歷所有元素,查找出自己感興趣的屬性。但是ET可以讓這個工作更加簡便、快捷。iter方法可以接受tag名稱,然后遍歷所有具備所提供tag的元素:

  1. >>> for elem in tree.iter(tag='branch'): 
  2. ...   print elem.tag, elem.attrib 
  3. ... 
  4. branch {'hash''1cdf045c''name''codingpy.com'
  5. branch {'hash''f200013e''name''release01'
  6. branch {'name''invalid'

支持通過XPath查找元素

使用XPath查找感興趣的元素,更加方便。Element對象中有一些find方法可以接受Xpath路徑作為參數,find方法會返回***個匹配的子元素,findall以列表的形式返回所有匹配的子元素, iterfind則返回一個所有匹配元素的迭代器(iterator)。ElementTree對象也具備這些方法,相應地它的查找是從根節點開始的。

下面是一個使用XPath查找元素的示例:

  1. >>> for elem in tree.iterfind('branch/sub-branch'): 
  2. ...   print elem.tag, elem.attrib 
  3. ... 
  4. sub-branch {'name''subrelease01'

上面的代碼返回了branch元素之下所有tag為sub-branch的元素。接下來查找所有具備某個name屬性的branch元素:

>>> for elem in tree.iterfind('branch[@name="release01"]'): ... print elem.tag, elem.attrib ... branch {'hash': 'f200013e', 'name': 'release01'}

構建XML文檔

利用ET,很容易就可以完成XML文檔構建,并寫入保存為文件。ElementTree對象的write方法就可以實現這個需求。

一般來說,有兩種主要使用場景。一是你先讀取一個XML文檔,進行修改,然后再將修改寫入文檔,二是從頭創建一個新XML文檔。

修改文檔的話,可以通過調整Element對象來實現。請看下面的例子:

  1. >>> root = tree.getroot() 
  2. >>> del root[2
  3. >>> root[0].set('foo''bar'
  4. >>> for subelem in root: 
  5. ...   print subelem.tag, subelem.attrib 
  6. ... 
  7. branch {'foo''bar''hash''1cdf045c''name''codingpy.com'
  8. branch {'hash''f200013e''name''release01'

在上面的代碼中,我們刪除了root元素的第三個子元素,為***個子元素增加了新屬性。這個樹可以重新寫入至文件中。最終的XML文檔應該是下面這樣的:


  1. >>> import sys 
  2. >>> tree.write(sys.stdout) 
  3. <doc> 
  4.     <branch foo="bar" hash="1cdf045c" name="codingpy.com"> text,source </branch> <branch hash="f200013e" name="release01"> <sub-branch name="subrelease01"> xml,sgml </sub-branch> </branch> </doc> 

請注意,文檔中元素的屬性順序與原文檔不同。這是因為ET是以字典的形式保存屬性的,而字典是一個無序的數據結構。當然,XML也不關注屬性的順序。

從頭構建一個完整的文檔也很容易。ET模塊提供了一個SubElement工廠函數,讓創建元素的過程變得很簡單:

  1. >>> a = ET.Element('elem'
  2. >>> c = ET.SubElement(a, 'child1'
  3. >>> c.text = "some text" >>> d = ET.SubElement(a, 'child2') >>> b = ET.Element('elem_b') >>> root = ET.Element('root') >>> root.extend((a, b)) >>> tree = ET.ElementTree(root) >>> tree.write(sys.stdout) <root><elem><child1>some text</child1><child2 /></elem><elem_b /></root> 

利用iterparse解析XML流

XML文檔通常都會比較大,如何直接將文檔讀入內存的話,那么進行解析時就會出現問題。這也就是為什么不建議使用DOM,而是SAX API的理由之一。

我們上面談到,ET可以將XML文檔加載為保存在內存里的樹(in-memory tree),然后再進行處理。但是在解析大文件時,這應該也會出現和DOM一樣的內存消耗大的問題吧?沒錯,的確有這個問題。為了解決這個問題,ET提供了一個類似SAX的特殊工具——iterparse,可以循序地解析XML。

接下來,筆者為大家展示如何使用iterparse,并與標準的樹解析方式進行對比。我們使用一個自動生成的XML文檔,下面是該文檔的開頭部分:

 

  1. <xml version="1.0" standalone="yes"?> 
  2. <site> 
  3.   <regions> 
  4.     <africa> 
  5.       <item id="item0"
  6.         <location>United States</location>    <!-- Counting locations --> 
  7.         <quantity>1</quantity> 
  8.         <name>duteous nine eighteen </name> 
  9.         <payment>Creditcard</payment> 
  10.         <description> 
  11.           <parlist> 
  12. [...] 

我們來統計一下文檔中出現了多少個文本值為Zimbabwe的location元素。下面是使用ET.parse的標準方法:

  1. tree = ET.parse(sys.argv[2]) 
  2.  
  3. count = 0 
  4. for elem in tree.iter(tag='location'): 
  5.     if elem.text == 'Zimbabwe'
  6.         count += 1 
  7. print count 

上面的代碼會將全部元素載入內存,逐一解析。當解析一個約100MB的XML文檔時,運行上面腳本的Python進程的內存使用峰值為約560MB,總運行時間問2.9秒。

請注意,我們其實不需要講整個樹加載到內存里。只要檢測出文本為相應值得location元素即可。其他數據都可以廢棄。這時,我們就可以用上iterparse方法了:

  1. count = 0 
  2. for event, elem in ET.iterparse(sys.argv[2]): 
  3.     if event == 'end'
  4.         if elem.tag == 'location' and elem.text == 'Zimbabwe'
  5.             count += 1 
  6.     elem.clear() # 將元素廢棄 
  7.  
  8. print count 

上面的for循環會遍歷iterparse事件,首先檢查事件是否為end,然后判斷元素的tag是否為location,以及其文本值是否符合目標值。另外,調用elem.clear()非常關鍵:因為iterparse仍然會生成一個樹,只是循序生成的而已。廢棄掉不需要的元素,就相當于廢棄了整個樹,釋放出系統分配的內存。

當利用上面這個腳本解析同一個文件時,內存使用峰值只有7MB,運行時間為2.5秒。速度提升的原因,是我們這里只在樹被構建時,遍歷一次。而使用parse的標準方法是先完成整個樹的構建后,才再次遍歷查找所需要的元素。

iterparse的性能與SAX相當,但是其API卻更加有用:iterparse會循序地構建樹;而利用SAX時,你還得自己完成樹的構建工作。

 

責任編輯:王雪燕 來源: 編程派
相關推薦

2019-11-18 16:20:48

RedisRDB數據庫

2009-12-02 13:16:32

PHP DOMXPat

2010-03-03 17:33:52

Python讀取XML

2010-07-30 09:16:24

Flex數據綁定

2009-09-09 14:40:15

C# XML解析

2021-01-19 11:56:19

Python開發語言

2010-08-16 14:02:22

CSS

2010-09-09 23:14:45

2013-03-27 11:33:32

iOS開發iOSjson解析方式

2014-12-31 14:09:23

xml解析

2009-12-02 10:49:59

PHP解析XML元素結

2009-12-02 10:39:26

PHP DOMDocu

2021-06-16 07:02:22

Python方式郵件

2023-10-25 18:18:10

Python腳本代碼

2020-07-14 09:58:01

Python開發工具

2011-05-24 11:28:20

OTN光交叉

2023-05-07 07:56:53

Python方式

2022-11-03 15:22:15

數據結構Python

2009-12-15 14:16:13

Ruby Contin

2021-05-07 16:19:36

異步編程Java線程
點贊
收藏

51CTO技術棧公眾號

日本不卡二区| 欧美激情18p| gai在线观看免费高清| 91高清在线观看视频| 成人网在线播放| 国产成人短视频| 三级影片在线看| 午夜a一级毛片亚洲欧洲| 欧美日韩久久久一区| 国产黄色激情视频| a中文在线播放| 成人激情免费电影网址| 国产日韩换脸av一区在线观看| 国产乡下妇女做爰| 久久在线视频免费观看| 日韩大陆欧美高清视频区| 日本人69视频| 芒果视频成人app| 亚洲另类在线一区| 亚洲成人在线视频网站| 天堂中文在线官网| 国产一区二区视频在线| 国产精品aaa| 黄色一级片免费看| 中文字幕一区二区三三| 国产亚洲精品久久久久久牛牛| 国产调教打屁股xxxx网站| 456成人影院在线观看| 午夜精品aaa| 日韩欧美视频免费在线观看| 在线视频1区2区| 久久蜜桃av一区二区天堂| 国产成人精品福利一区二区三区 | 尤物在线视频| 久久日一线二线三线suv| 国产精品高清一区二区三区| 一级黄色大片免费观看| 免费看亚洲片| 性欧美激情精品| 国产性一乱一性一伧一色| 外国成人免费视频| 色小说视频一区| 熟女少妇内射日韩亚洲| 亚洲都市激情| 亚洲精品一区久久久久久| jjzz黄色片| 136国产福利精品导航网址应用| 欧美美女网站色| 中文字幕免费高清在线| 国产成人亚洲一区二区三区| 欧美综合在线视频| 久久婷婷国产91天堂综合精品| 国模精品视频| 欧美日韩亚洲高清| 六月激情综合网| 粉嫩一区二区| 在线亚洲人成电影网站色www| 日韩av资源在线| 欧美成人ⅴideosxxxxx| 日本福利一区二区| 中文字幕永久视频| 亚洲天堂网站| 日韩午夜av电影| 99日在线视频| 久久久久九九精品影院| 精品国产一区二区在线观看| 亚洲一区和二区| 精品国产一区二区三区成人影院| 欧美成人一区二区三区| 白嫩情侣偷拍呻吟刺激| 青草久久视频| 伊人一区二区三区久久精品| 男人的午夜天堂| 午夜电影亚洲| 欧美怡春院一区二区三区| 五月天婷婷导航| 日本在线不卡一区| 91美女片黄在线观| 免费观看黄一级视频| 久久综合久久综合亚洲| 亚洲精品无人区| 91中文在线| 亚洲va国产va欧美va观看| 欧美aⅴ在线观看| а天堂中文最新一区二区三区| 日韩美女在线视频| 黄色正能量网站| 久久一级电影| 久久免费视频这里只有精品| 51国产偷自视频区视频| 午夜在线观看免费一区| 国产欧美一区二区三区久久人妖 | 韩国精品久久久| 国产精品sss| 国产污视频在线| 亚洲欧美日本韩国| 国产亚洲精品网站| 豆花视频一区| 亚洲人成绝费网站色www| 国产精品国产精品88| 国产一区白浆| 91精品视频在线| 黄视频在线播放| 一区二区成人在线| 艹b视频在线观看| jizzjizzjizz欧美| 日韩一级黄色av| 国产三级av片| 黄网站免费久久| 日本视频一区二区不卡| 午夜羞羞小视频在线观看| 欧美视频国产精品| 精品人妻一区二区乱码| 不卡一区综合视频| 欧美亚洲日本网站| xxxwww在线观看| 国产精品婷婷午夜在线观看| 日本免费不卡一区二区| 视频欧美一区| 日韩视频在线免费| 中文字幕第2页| 99久久99久久精品免费观看| 法国空姐在线观看免费| 久久精品97| 亚洲人成免费电影| 欧美另类一区二区| 懂色av一区二区三区免费观看| 亚洲欧美日韩不卡一区二区三区| 日韩深夜视频| 亚洲国产精品推荐| 欧美国产精品一二三| 麻豆精品国产91久久久久久| 日本高清不卡一区二区三| 7777kkk亚洲综合欧美网站| 欧美欧美欧美欧美首页| 我和岳m愉情xxxⅹ视频| 99riav国产精品| 国产精品亚洲一区| tube8在线hd| 日韩久久精品一区| 青娱乐国产在线| 国产精品99久久久久久久女警| 一本久道久久综合| 国产福利亚洲| 色诱女教师一区二区三区| 嫩草影院一区二区三区| 久久久久久综合| 日本精品免费在线观看| 蜜桃一区二区| 人体精品一二三区| 黄色av免费在线观看| 日本福利一区二区| 69xxx免费| 久久99久久久久| 樱空桃在线播放| 亚洲精品影片| 69久久夜色精品国产69乱青草| 日本高清视频网站| 欧美日韩一区二区在线| 熟女高潮一区二区三区| 日韩高清不卡在线| 亚洲午夜在线观看| 精品久久亚洲| 国内外成人免费激情在线视频| 日本精品久久久久久| 欧美日韩国产中文精品字幕自在自线| 在线观看国产三级| 日韩二区三区四区| 国产一区免费观看| www日韩av| 国产精品美女久久| 国产精品久久久久久久美男| 久久99精品久久久久久噜噜 | 日韩国产成人无码av毛片| 日韩视频一二三| 黄色一级片播放| 国产一伦一伦一伦| 中文字幕免费看| 亚洲成a人片在线www| 中文字幕一区二区在线观看视频| 影音先锋在线播放| 日韩一级成人av| 动漫精品一区一码二码三码四码| 99在线视频精品| 日本888xxxx| 午夜精品av| 久久久久久艹| 亚洲三级电影| 欧美一级大片在线免费观看| 999在线视频| 日韩精品中文字幕在线一区| 日本视频在线观看免费| 国产精品国产三级国产有无不卡| 精品人妻二区中文字幕| 久久久久欧美精品| 亚洲一区 在线播放| 亚洲+变态+欧美+另类+精品| 国产裸体写真av一区二区 | 久久精品国产91精品亚洲| 成人免费观看在线视频| 在线日韩国产精品| 久久精品国产亚洲AV无码男同| 国产性天天综合网| 无码人妻aⅴ一区二区三区玉蒲团| 日欧美一区二区| av片在线免费| 欧美成人milf| 热re99久久精品国产99热| 视频精品国内| 国产精品视频一| 成年人视频免费在线播放| 中文字幕最新精品| 日韩有码电影| 日韩精品一区二区三区视频在线观看 | 久久精品国产亚洲夜色av网站| 国产女主播一区二区| 婷婷丁香久久| 国产成人中文字幕| 中文一区一区三区高中清不卡免费| 欧美超级乱淫片喷水| 第三区美女视频在线| 亚洲精品久久久久久久久久久久 | 精品处破女学生| 国产精品福利在线播放| 免费a级黄色片| www.爱久久.com| 精品伦一区二区三区| 久久激五月天综合精品| 亚洲欧美激情网| 国产亚洲成人一区| 99视频在线免费播放| 黑丝一区二区三区| 免费的一级黄色片| 午夜欧美理论片| 欧洲xxxxx| 亚洲欧美偷拍自拍| 黄色www在线观看| 日韩激情图片| 亚洲欧洲精品在线| 日韩dvd碟片| 亚洲国产一区二区三区在线播| 宅男在线一区| 日本10禁啪啪无遮挡免费一区二区| 亚洲理论电影| 麻豆成人在线播放| 亚洲免费专区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 欧美激情视频网站| 日韩精品卡一| 久久久久久综合网天天| 91桃色在线| 91国自产精品中文字幕亚洲| 中文字幕 在线观看| 欧洲日本亚洲国产区| 天堂av在线网| 国产www精品| 成人黄色视屏网站| 成人亚洲激情网| 91九色鹿精品国产综合久久香蕉| 国产成人女人毛片视频在线| 国产伦精品一区二区三区在线播放 | 亚洲自拍一区在线观看| 日韩欧美在线一区| www.久久网| 91麻豆精品国产91久久久使用方法 | 精品国产凹凸成av人导航| 黄色av一区二区三区| 亚洲精品国产综合久久| 国产剧情在线观看| 久久视频免费观看| av电影院在线看| 欧洲成人午夜免费大片| 欧美成人高清视频在线观看| 97免费资源站| 网友自拍区视频精品| 亚洲国产精品一区二区第四页av| 欧美激情偷拍自拍| 99久久免费观看| 老妇喷水一区二区三区| 亚洲黄色片免费| www.亚洲免费av| 超薄肉色丝袜一二三| 有坂深雪av一区二区精品| 国产精品乱子伦| 欧美日韩美少妇| 色呦呦视频在线| 最新日韩中文字幕| 国内小视频在线看| 国产精品激情自拍| 亚洲一区二区三区免费| 欧美日韩亚洲一区二区三区四区| 欧美黄色录像片| 久久久久久久久久久99| 久久99精品国产麻豆婷婷| 日本在线精品视频| 中文在线手机av| 2019国产精品自在线拍国产不卡| 欧美三区四区| 国产欧美日韩伦理| 欧美成免费一区二区视频| 日本免费不卡一区二区| 国产乱码精品一区二区三区忘忧草 | 日韩成人在线免费观看| 欧美成人xxx| 91爱视频在线| 欧美视频三区| 午夜精品一区二区在线观看的| 狠狠色综合网| 亚洲欧美日韩精品一区| 国产欧美一区二区精品性色| 黄色小说在线观看视频| 欧美剧在线免费观看网站| 亚洲色偷精品一区二区三区| 久久亚洲综合国产精品99麻豆精品福利 | 亚洲精品一级二级三级| 久久综合亚洲精品| 激情国产一区二区| 手机看片日韩av| 欧美性猛交xxxx偷拍洗澡| 成人免费观看在线视频| 萌白酱国产一区二区| 四虎影视精品永久在线观看| 日本黑人久久| 性欧美长视频| 麻豆国产精品一区| 亚洲成人动漫av| 精品人妻一区二区三区蜜桃 | 三级黄色片在线观看| 一本大道av一区二区在线播放| 丁香花免费高清完整在线播放 | www.xx日本| 欧美日韩在线三区| 加勒比一区二区三区在线| 97在线视频一区| 成人另类视频| 日韩久久久久久久久久久久| 国产一区二区三区免费观看| 国产wwwwxxxx| 4438x亚洲最大成人网| 视频一区二区三区不卡| 国产精品一区二区三区成人| 国产欧美高清视频在线| 凹凸日日摸日日碰夜夜爽1| 久久亚洲二区三区| chinese国产精品| 国产亚洲欧美aaaa| 懂色aⅴ精品一区二区三区| 亚洲精品9999| 九色porny丨国产精品| 精品国产精品国产精品| 欧美一区二区在线不卡| aaa大片在线观看| 古典武侠综合av第一页| 在线免费高清一区二区三区| 日韩少妇一区二区| 欧美日韩一区二区在线| 激情小视频在线| 国产一区二区丝袜高跟鞋图片| 国产精品99一区二区三| 日本少妇一区二区三区| 亚洲一区中文日韩| 午夜小视频在线播放| 日本乱人伦a精品| 色777狠狠狠综合伊人| 午夜免费福利网站| 亚洲成人www| 六十路在线观看| 国产欧美日韩专区发布| 国产一区二区三区四区三区四 | 亚洲成人一品| 日本新janpanese乱熟| 国产精品乱码久久久久久| 国产日韩精品suv| 国语自产偷拍精品视频偷| 国产成人精品免费视| 午夜免费一级片| 亚洲一级二级三级| 你懂的在线免费观看| 91精品久久久久久久| 在线国产精品一区| 天天躁日日躁aaaa视频| 91精品福利在线一区二区三区 | 国产精品久久久久久av福利| 我不卡伦不卡影院| 精品一区二区视频在线观看| 欧美性三三影院| 宅男在线观看免费高清网站| 久久精品五月婷婷| 国内外成人在线| 黄色在线观看国产| 麻豆成人在线看| 免费视频一区三区| 亚洲成人激情小说| 在线观看一区二区视频| 日本动漫理论片在线观看网站| 欧美12av| 国产91综合一区在线观看| 日韩精选在线观看| 亚洲18私人小影院| 自产国语精品视频|