久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【python】BeautifulSoup的应用

發(fā)布時間:2023/12/20 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【python】BeautifulSoup的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1 from bs4 import BeautifulSoup
#下面的一段HTML代碼將作為例子被多次用到.這是 愛麗絲夢游仙境的 的一段內容(以后內容中簡稱為 愛麗絲 的文檔):
2 html_doc = """ 3 <html><head><title>The Dormouse's story</title></head> 4 <body> 5 <p class="title"><b>The Dormouse's story</b></p> 6 7 <p class="story">Once upon a time there were three little sisters; and their names were 8 <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, 9 <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 10 <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 11 and they lived at the bottom of a well.</p> 12 13 <p class="story">...</p> 14 """
#使用BeautifulSoup解析這段代碼,能夠得到一個 BeautifulSoup 的對象,并能按照標準的縮進格式的結構輸出:
15 soup = BeautifulSoup(html_doc, 'html.parser')#html.parser為解析html_doc這段源碼的編譯器 16 #下面是從代碼中提取具體想要內容的語句 17 #print(soup.prettify()) 18 print(soup.title) 19 print(soup.title.string) 20 print(soup.find_all('a')) 21 print(soup.a.string) 22 print(soup.find(id='link2')) 23 print(soup.find_all('p')) 24 print(soup.get_text()) 25 for c in soup.find_all('a'): 26 print(c.get('href'))

幾個簡單的瀏覽結構化數據的方法:

soup.title # <title>The Dormouse's story</title>soup.title.name # u'title' soup.title.string # u'The Dormouse's story' soup.title.parent.name # u'head' soup.p # <p class="title"><b>The Dormouse's story</b></p> soup.p['class'] # u'title' soup.a # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> soup.find_all('a') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.find(id="link3") # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

從文檔中找到所有<a>標簽的鏈接:

for link in soup.find_all('a'): print(link.get('href')) # http://example.com/elsie # http://example.com/lacie # http://example.com/tillie

從文檔中獲取所有文字內容:

print(soup.get_text()) # The Dormouse's story # # The Dormouse's story # # Once upon a time there were three little sisters; and their names were # Elsie, # Lacie and # Tillie; # and they lived at the bottom of a well. # # ...

這是你想要的嗎?別著急,還有更好用的

安裝 Beautiful Soup

如果你用的是新版的Debain或ubuntu,那么可以通過系統(tǒng)的軟件包管理來安裝:

$ apt-get install Python-bs4

Beautiful Soup 4 通過PyPi發(fā)布,所以如果你無法使用系統(tǒng)包管理安裝,那么也可以通過 easy_installpip 來安裝.包的名字是 beautifulsoup4 ,這個包兼容Python2和Python3.

$ easy_install beautifulsoup4

$ pip install beautifulsoup4

(在PyPi中還有一個名字是 BeautifulSoup 的包,但那可能不是你想要的,那是 Beautiful Soup3 的發(fā)布版本,因為很多項目還在使用BS3, 所以 BeautifulSoup 包依然有效.但是如果你在編寫新項目,那么你應該安裝的 beautifulsoup4 )

如果你沒有安裝 easy_installpip ,那你也可以 下載BS4的源碼 ,然后通過setup.py來安裝.

$ Python setup.py install

如果上述安裝方法都行不通,Beautiful Soup的發(fā)布協(xié)議允許你將BS4的代碼打包在你的項目中,這樣無須安裝即可使用.

作者在Python2.7和Python3.2的版本下開發(fā)Beautiful Soup, 理論上Beautiful Soup應該在所有當前的Python版本中正常工作

安裝完成后的問題

Beautiful Soup發(fā)布時打包成Python2版本的代碼,在Python3環(huán)境下安裝時,會自動轉換成Python3的代碼,如果沒有一個安裝的過程,那么代碼就不會被轉換.

如果代碼拋出了 ImportError 的異常: “No module named HTMLParser”, 這是因為你在Python3版本中執(zhí)行Python2版本的代碼.

如果代碼拋出了 ImportError 的異常: “No module named html.parser”, 這是因為你在Python2版本中執(zhí)行Python3版本的代碼.

如果遇到上述2種情況,最好的解決方法是重新安裝BeautifulSoup4.

如果在ROOT_TAG_NAME = u’[document]’代碼處遇到 SyntaxError “Invalid syntax”錯誤,需要將把BS4的Python代碼版本從Python2轉換到Python3. 可以重新安裝BS4:

$ Python3 setup.py install

或在bs4的目錄中執(zhí)行Python代碼版本轉換腳本

$ 2to3-3.2 -w bs4

安裝解析器

Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,其中一個是 lxml .根據操作系統(tǒng)不同,可以選擇下列方法來安裝lxml:

$ apt-get install Python-lxml

$ easy_install lxml

$ pip install lxml

另一個可供選擇的解析器是純Python實現的 html5lib , html5lib的解析方式與瀏覽器相同,可以選擇下列方法來安裝html5lib:

$ apt-get install Python-html5lib

$ easy_install html5lib

$ pip install html5lib

下表列出了主要的解析器,以及它們的優(yōu)缺點:

解析器使用方法優(yōu)勢劣勢
Python標準庫BeautifulSoup(markup, "html.parser")
  • Python的內置標準庫
  • 執(zhí)行速度適中
  • 文檔容錯能力強
  • Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
lxml HTML 解析器BeautifulSoup(markup, "lxml")
  • 速度快
  • 文檔容錯能力強
  • 需要安裝C語言庫
lxml XML 解析器

BeautifulSoup(markup, ["lxml", "xml"])

BeautifulSoup(markup, "xml")

  • 速度快
  • 唯一支持XML的解析器
  • 需要安裝C語言庫
html5libBeautifulSoup(markup, "html5lib")
  • 最好的容錯性
  • 以瀏覽器的方式解析文檔
  • 生成HTML5格式的文檔
  • 速度慢
  • 不依賴外部擴展

推薦使用lxml作為解析器,因為效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必須安裝lxml或html5lib, 因為那些Python版本的標準庫中內置的HTML解析方法不夠穩(wěn)定.

提示: 如果一段HTML或XML文檔格式不正確的話,那么在不同的解析器中返回的結果可能是不一樣的,查看 解析器之間的區(qū)別 了解更多細節(jié)

如何使用

將一段文檔傳入BeautifulSoup 的構造方法,就能得到一個文檔的對象, 可以傳入一段字符串或一個文件句柄.

from bs4 import BeautifulSoupsoup = BeautifulSoup(open("index.html")) soup = BeautifulSoup("<html>data</html>")

首先,文檔被轉換成Unicode,并且HTML的實例都被轉換成Unicode編碼

BeautifulSoup("Sacr&eacute; bleu!") <html><head></head><body>Sacré bleu!</body></html>

然后,Beautiful Soup選擇最合適的解析器來解析這段文檔,如果手動指定解析器那么Beautiful Soup會選擇指定的解析器來解析文檔.(參考 解析成XML ).

對象的種類

Beautiful Soup將復雜HTML文檔轉換成一個復雜的樹形結構,每個節(jié)點都是Python對象,所有對象可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment .

Tag

Tag 對象與XML或HTML原生文檔中的tag相同:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') tag = soup.b type(tag) # <class 'bs4.element.Tag'>

Tag有很多方法和屬性,在 遍歷文檔樹 和 搜索文檔樹 中有詳細解釋.現在介紹一下tag中最重要的屬性: name和attributes

Name

每個tag都有自己的名字,通過 .name 來獲取:

tag.name # u'b'

如果改變了tag的name,那將影響所有通過當前Beautiful Soup對象生成的HTML文檔:

tag.name = "blockquote" tag # <blockquote class="boldest">Extremely bold</blockquote>

Attributes

一個tag可能有很多個屬性. tag <b class="boldest"> 有一個 “class” 的屬性,值為 “boldest” . tag的屬性的操作方法與字典相同:

tag['class'] # u'boldest'

也可以直接”點”取屬性, 比如: .attrs :

tag.attrs # {u'class': u'boldest'}

tag的屬性可以被添加,刪除或修改. 再說一次, tag的屬性操作方法與字典一樣

tag['class'] = 'verybold' tag['id'] = 1 tag # <blockquote class="verybold" id="1">Extremely bold</blockquote> del tag['class'] del tag['id'] tag # <blockquote>Extremely bold</blockquote> tag['class'] # KeyError: 'class' print(tag.get('class')) # None

多值屬性

HTML 4定義了一系列可以包含多個值的屬性.在HTML5中移除了一些,卻增加更多.最常見的多值的屬性是 class (一個tag可以有多個CSS的class). 還有一些屬性 rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值屬性的返回類型是list:

css_soup = BeautifulSoup('<p class="body strikeout"></p>') css_soup.p['class'] # ["body", "strikeout"] css_soup = BeautifulSoup('<p class="body"></p>') css_soup.p['class'] # ["body"]

如果某個屬性看起來好像有多個值,但在任何版本的HTML定義中都沒有被定義為多值屬性,那么Beautiful Soup會將這個屬性作為字符串返回

id_soup = BeautifulSoup('<p id="my id"></p>') id_soup.p['id'] # 'my id'

將tag轉換成字符串時,多值屬性會合并為一個值

rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>') rel_soup.a['rel'] # ['index'] rel_soup.a['rel'] = ['index', 'contents'] print(rel_soup.p) # <p>Back to the <a rel="index contents">homepage</a></p>

如果轉換的文檔是XML格式,那么tag中不包含多值屬性

xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml') xml_soup.p['class'] # u'body strikeout'

可以遍歷的字符串

字符串常被包含在tag內.Beautiful Soup用 NavigableString 類來包裝tag中的字符串:

tag.string # u'Extremely bold' type(tag.string) # <class 'bs4.element.NavigableString'>

一個 NavigableString 字符串與Python中的Unicode字符串相同,并且還支持包含在 遍歷文檔樹 和 搜索文檔樹 中的一些特性. 通過 unicode() 方法可以直接將 NavigableString 對象轉換成Unicode字符串:

unicode_string = unicode(tag.string) unicode_string # u'Extremely bold' type(unicode_string) # <type 'unicode'>

tag中包含的字符串不能編輯,但是可以被替換成其它的字符串,用 replace_with() 方法:

tag.string.replace_with("No longer bold") tag # <blockquote>No longer bold</blockquote>

NavigableString 對象支持 遍歷文檔樹 和 搜索文檔樹 中定義的大部分屬性, 并非全部.尤其是,一個字符串不能包含其它內容(tag能夠包含字符串或是其它tag),字符串不支持 .contents.string 屬性或 find() 方法.

如果想在Beautiful Soup之外使用 NavigableString 對象,需要調用 unicode() 方法,將該對象轉換成普通的Unicode字符串,否則就算Beautiful Soup已方法已經執(zhí)行結束,該對象的輸出也會帶有對象的引用地址.這樣會浪費內存.

BeautifulSoup

BeautifulSoup 對象表示的是一個文檔的全部內容.大部分時候,可以把它當作 Tag 對象,它支持 遍歷文檔樹 和 搜索文檔樹 中描述的大部分的方法.

因為 BeautifulSoup 對象并不是真正的HTML或XML的tag,所以它沒有name和attribute屬性.但有時查看它的 .name 屬性是很方便的,所以 BeautifulSoup 對象包含了一個值為 “[document]” 的特殊屬性 .name

soup.name # u'[document]'

注釋及特殊字符串

Tag , NavigableString , BeautifulSoup 幾乎覆蓋了html和xml中的所有內容,但是還有一些特殊對象.容易讓人擔心的內容是文檔的注釋部分:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" soup = BeautifulSoup(markup) comment = soup.b.string type(comment) # <class 'bs4.element.Comment'>

Comment 對象是一個特殊類型的 NavigableString 對象:

comment # u'Hey, buddy. Want to buy a used parser'

但是當它出現在HTML文檔中時, Comment 對象會使用特殊的格式輸出:

print(soup.b.prettify()) # <b> # <!--Hey, buddy. Want to buy a used parser?--> # </b>

Beautiful Soup中定義的其它類型都可能會出現在XML的文檔中: CData , ProcessingInstruction , Declaration , Doctype .與 Comment 對象類似,這些類都是 NavigableString 的子類,只是添加了一些額外的方法的字符串獨享.下面是用CDATA來替代注釋的例子:

from bs4 import CData cdata = CData("A CDATA block") comment.replace_with(cdata) print(soup.b.prettify()) # <b> # <![CDATA[A CDATA block]]> # </b>

遍歷文檔樹

還拿”愛麗絲夢游仙境”的文檔來做例子:

html_doc = """ <html><head><title>The Dormouse's story</title></head><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc)

通過這段例子來演示怎樣從文檔的一段內容找到另一段內容

子節(jié)點

一個Tag可能包含多個字符串或其它的Tag,這些都是這個Tag的子節(jié)點.Beautiful Soup提供了許多操作和遍歷子節(jié)點的屬性.

注意: Beautiful Soup中字符串節(jié)點不支持這些屬性,因為字符串沒有子節(jié)點

tag的名字

操作文檔樹最簡單的方法就是告訴它你想獲取的tag的name.如果想獲取 <head> 標簽,只要用 soup.head :

soup.head # <head><title>The Dormouse's story</title></head>soup.title # <title>The Dormouse's story</title>

這是個獲取tag的小竅門,可以在文檔樹的tag中多次調用這個方法.下面的代碼可以獲取<body>標簽中的第一個<b>標簽:

soup.body.b # <b>The Dormouse's story</b>

通過點取屬性的方式只能獲得當前名字的第一個tag:

soup.a # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

如果想要得到所有的<a>標簽,或是通過名字得到比一個tag更多的內容的時候,就需要用到 Searching the tree 中描述的方法,比如: find_all()

soup.find_all('a') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

.contents 和 .children

tag的 .contents 屬性可以將tag的子節(jié)點以列表的方式輸出:

head_tag = soup.head head_tag # <head><title>The Dormouse's story</title></head>head_tag.contents [<title>The Dormouse's story</title>]title_tag = head_tag.contents[0] title_tag # <title>The Dormouse's story</title> title_tag.contents # [u'The Dormouse's story']

BeautifulSoup 對象本身一定會包含子節(jié)點,也就是說<html>標簽也是 BeautifulSoup 對象的子節(jié)點:

len(soup.contents) # 1 soup.contents[0].name # u'html'

字符串沒有 .contents 屬性,因為字符串沒有子節(jié)點:

text = title_tag.contents[0] text.contents # AttributeError: 'NavigableString' object has no attribute 'contents'

通過tag的 .children 生成器,可以對tag的子節(jié)點進行循環(huán):

for child in title_tag.children: print(child) # The Dormouse's story

.descendants

.contents.children 屬性僅包含tag的直接子節(jié)點.例如,<head>標簽只有一個直接子節(jié)點<title>

head_tag.contents # [<title>The Dormouse's story</title>]

但是<title>標簽也包含一個子節(jié)點:字符串 “The Dormouse’s story”,這種情況下字符串 “The Dormouse’s story”也屬于<head>標簽的子孫節(jié)點. .descendants 屬性可以對所有tag的子孫節(jié)點進行遞歸循環(huán) [5] :

for child in head_tag.descendants: print(child) # <title>The Dormouse's story</title> # The Dormouse's story

上面的例子中, <head>標簽只有一個子節(jié)點,但是有2個子孫節(jié)點:<head>節(jié)點和<head>的子節(jié)點, BeautifulSoup 有一個直接子節(jié)點(<html>節(jié)點),卻有很多子孫節(jié)點:

len(list(soup.children)) # 1 len(list(soup.descendants)) # 25

.string

如果tag只有一個 NavigableString 類型子節(jié)點,那么這個tag可以使用 .string 得到子節(jié)點:

title_tag.string # u'The Dormouse's story'

如果一個tag僅有一個子節(jié)點,那么這個tag也可以使用 .string 方法,輸出結果與當前唯一子節(jié)點的 .string 結果相同:

head_tag.contents # [<title>The Dormouse's story</title>]head_tag.string # u'The Dormouse's story'

如果tag包含了多個子節(jié)點,tag就無法確定 .string 方法應該調用哪個子節(jié)點的內容, .string 的輸出結果是 None :

print(soup.html.string) # None

.strings 和 stripped_strings

如果tag中包含多個字符串 [2] ,可以使用 .strings 來循環(huán)獲取:

for string in soup.strings: print(repr(string)) # u"The Dormouse's story" # u'\n\n' # u"The Dormouse's story" # u'\n\n' # u'Once upon a time there were three little sisters; and their names were\n' # u'Elsie' # u',\n' # u'Lacie' # u' and\n' # u'Tillie' # u';\nand they lived at the bottom of a well.' # u'\n\n' # u'...' # u'\n'

輸出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白內容:

for string in soup.stripped_strings: print(repr(string)) # u"The Dormouse's story" # u"The Dormouse's story" # u'Once upon a time there were three little sisters; and their names were' # u'Elsie' # u',' # u'Lacie' # u'and' # u'Tillie' # u';\nand they lived at the bottom of a well.' # u'...'

全部是空格的行會被忽略掉,段首和段末的空白會被刪除

父節(jié)點

繼續(xù)分析文檔樹,每個tag或字符串都有父節(jié)點:被包含在某個tag中

.parent

通過 .parent 屬性來獲取某個元素的父節(jié)點.在例子“愛麗絲”的文檔中,<head>標簽是<title>標簽的父節(jié)點:

title_tag = soup.title title_tag # <title>The Dormouse's story</title> title_tag.parent # <head><title>The Dormouse's story</title></head>

文檔title的字符串也有父節(jié)點:<title>標簽

title_tag.string.parent # <title>The Dormouse's story</title>

文檔的頂層節(jié)點比如<html>的父節(jié)點是 BeautifulSoup 對象:

html_tag = soup.html type(html_tag.parent) # <class 'bs4.BeautifulSoup'>

BeautifulSoup 對象的 .parent 是None:

print(soup.parent) # None

.parents

通過元素的 .parents 屬性可以遞歸得到元素的所有父輩節(jié)點,下面的例子使用了 .parents 方法遍歷了<a>標簽到根節(jié)點的所有節(jié)點.

link = soup.a link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> for parent in link.parents: if parent is None: print(parent) else: print(parent.name) # p # body # html # [document] # None

兄弟節(jié)點

看一段簡單的例子:

sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>") print(sibling_soup.prettify()) # <html> # <body> # <a> # <b> # text1 # </b> # <c> # text2 # </c> # </a> # </body> # </html>

因為<b>標簽和<c>標簽是同一層:他們是同一個元素的子節(jié)點,所以<b>和<c>可以被稱為兄弟節(jié)點.一段文檔以標準格式輸出時,兄弟節(jié)點有相同的縮進級別.在代碼中也可以使用這種關系.

.next_sibling 和 .previous_sibling

在文檔樹中,使用 .next_sibling.previous_sibling 屬性來查詢兄弟節(jié)點:

sibling_soup.b.next_sibling # <c>text2</c> sibling_soup.c.previous_sibling # <b>text1</b>

<b>標簽有 .next_sibling 屬性,但是沒有 .previous_sibling 屬性,因為<b>標簽在同級節(jié)點中是第一個.同理,<c>標簽有 .previous_sibling 屬性,卻沒有 .next_sibling 屬性:

print(sibling_soup.b.previous_sibling) # None print(sibling_soup.c.next_sibling) # None

例子中的字符串“text1”和“text2”不是兄弟節(jié)點,因為它們的父節(jié)點不同:

sibling_soup.b.string # u'text1' print(sibling_soup.b.string.next_sibling) # None

實際文檔中的tag的 .next_sibling.previous_sibling 屬性通常是字符串或空白. 看看“愛麗絲”文檔:

<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>

如果以為第一個<a>標簽的 .next_sibling 結果是第二個<a>標簽,那就錯了,真實結果是第一個<a>標簽和第二個<a>標簽之間的頓號和換行符:

link = soup.a link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> link.next_sibling # u',\n'

第二個<a>標簽是頓號的 .next_sibling 屬性:

link.next_sibling.next_sibling # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>

.next_siblings 和 .previous_siblings

通過 .next_siblings.previous_siblings 屬性可以對當前節(jié)點的兄弟節(jié)點迭代輸出:

for sibling in soup.a.next_siblings: print(repr(sibling)) # u',\n' # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> # u' and\n' # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> # u'; and they lived at the bottom of a well.' # None for sibling in soup.find(id="link3").previous_siblings: print(repr(sibling)) # ' and\n' # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> # u',\n' # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> # u'Once upon a time there were three little sisters; and their names were\n' # None

回退和前進

看一下“愛麗絲” 文檔:

<html><head><title>The Dormouse's story</title></head> <p class="title"><b>The Dormouse's story</b></p>

HTML解析器把這段字符串轉換成一連串的事件: “打開<html>標簽”,”打開一個<head>標簽”,”打開一個<title>標簽”,”添加一段字符串”,”關閉<title>標簽”,”打開<p>標簽”,等等.Beautiful Soup提供了重現解析器初始化過程的方法.

.next_element 和 .previous_element

.next_element 屬性指向解析過程中下一個被解析的對象(字符串或tag),結果可能與 .next_sibling 相同,但通常是不一樣的.

這是“愛麗絲”文檔中最后一個<a>標簽,它的 .next_sibling 結果是一個字符串,因為當前的解析過程 [2] 因為當前的解析過程因為遇到了<a>標簽而中斷了:

last_a_tag = soup.find("a", id="link3") last_a_tag # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> last_a_tag.next_sibling # '; and they lived at the bottom of a well.'

但這個<a>標簽的 .next_element 屬性結果是在<a>標簽被解析之后的解析內容,不是<a>標簽后的句子部分,應該是字符串”Tillie”:

last_a_tag.next_element # u'Tillie'

這是因為在原始文檔中,字符串“Tillie” 在分號前出現,解析器先進入<a>標簽,然后是字符串“Tillie”,然后關閉</a>標簽,然后是分號和剩余部分.分號與<a>標簽在同一層級,但是字符串“Tillie”會被先解析.

.previous_element 屬性剛好與 .next_element 相反,它指向當前被解析的對象的前一個解析對象:

last_a_tag.previous_element # u' and\n' last_a_tag.previous_element.next_element # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

.next_elements 和 .previous_elements

通過 .next_elements.previous_elements 的迭代器就可以向前或向后訪問文檔的解析內容,就好像文檔正在被解析一樣:

for element in last_a_tag.next_elements: print(repr(element)) # u'Tillie' # u';\nand they lived at the bottom of a well.' # u'\n\n' # <p class="story">...</p> # u'...' # u'\n' # None

搜索文檔樹

Beautiful Soup定義了很多搜索方法,這里著重介紹2個: find()find_all() .其它方法的參數和用法類似,請讀者舉一反三.

再以“愛麗絲”文檔作為例子:

html_doc = """ <html><head><title>The Dormouse's story</title></head><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc)

使用 find_all() 類似的方法可以查找到想要查找的文檔內容

過濾器

介紹 find_all() 方法前,先介紹一下過濾器的類型 [3] ,這些過濾器貫穿整個搜索的API.過濾器可以被用在tag的name中,節(jié)點的屬性中,字符串中或他們的混合中.

字符串

最簡單的過濾器是字符串.在搜索方法中傳入一個字符串參數,Beautiful Soup會查找與字符串完整匹配的內容,下面的例子用于查找文檔中所有的<b>標簽:

soup.find_all('b') # [<b>The Dormouse's story</b>]

如果傳入字節(jié)碼參數,Beautiful Soup會當作UTF-8編碼,可以傳入一段Unicode 編碼來避免Beautiful Soup解析編碼出錯

正則表達式

如果傳入正則表達式作為參數,Beautiful Soup會通過正則表達式的 match() 來匹配內容.下面例子中找出所有以b開頭的標簽,這表示<body>和<b>標簽都應該被找到:

import re for tag in soup.find_all(re.compile("^b")): print(tag.name) # body # b

下面代碼找出所有名字中包含”t”的標簽:

for tag in soup.find_all(re.compile("t")): print(tag.name) # html # title

列表

如果傳入列表參數,Beautiful Soup會將與列表中任一元素匹配的內容返回.下面代碼找到文檔中所有<a>標簽和<b>標簽:

soup.find_all(["a", "b"]) # [<b>The Dormouse's story</b>, # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

True

True 可以匹配任何值,下面代碼查找到所有的tag,但是不會返回字符串節(jié)點

for tag in soup.find_all(True): print(tag.name) # html # head # title # body # p # b # p # a # a # a # p

方法

如果沒有合適過濾器,那么還可以定義一個方法,方法只接受一個元素參數 [4] ,如果這個方法返回 True 表示當前元素匹配并且被找到,如果不是則反回 False

下面方法校驗了當前元素,如果包含 class 屬性卻不包含 id 屬性,那么將返回 True:

def has_class_but_no_id(tag):return tag.has_attr('class') and not tag.has_attr('id')

將這個方法作為參數傳入 find_all() 方法,將得到所有<p>標簽:

soup.find_all(has_class_but_no_id) # [<p class="title"><b>The Dormouse's story</b></p>, # <p class="story">Once upon a time there were...</p>, # <p class="story">...</p>]

返回結果中只有<p>標簽沒有<a>標簽,因為<a>標簽還定義了”id”,沒有返回<html>和<head>,因為<html>和<head>中沒有定義”class”屬性.

下面代碼找到所有被文字包含的節(jié)點內容:

from bs4 import NavigableString def surrounded_by_strings(tag): return (isinstance(tag.next_element, NavigableString) and isinstance(tag.previous_element, NavigableString)) for tag in soup.find_all(surrounded_by_strings): print tag.name # p # a # a # a # p

現在來了解一下搜索方法的細節(jié)

find_all()

find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索當前tag的所有tag子節(jié)點,并判斷是否符合過濾器的條件.這里有幾個例子:

soup.find_all("title") # [<title>The Dormouse's story</title>] soup.find_all("p", "title") # [<p class="title"><b>The Dormouse's story</b></p>] soup.find_all("a") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.find_all(id="link2") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] import re soup.find(text=re.compile("sisters")) # u'Once upon a time there were three little sisters; and their names were\n'

有幾個方法很相似,還有幾個方法是新的,參數中的 textid 是什么含義? 為什么 find_all("p", "title") 返回的是CSS Class為”title”的<p>標簽? 我們來仔細看一下 find_all() 的參數

name 參數

name 參數可以查找所有名字為 name 的tag,字符串對象會被自動忽略掉.

簡單的用法如下:

soup.find_all("title") # [<title>The Dormouse's story</title>]

重申: 搜索 name 參數的值可以使任一類型的 過濾器 ,字符竄,正則表達式,列表,方法或是 True .

keyword 參數

如果一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數當作指定名字tag的屬性來搜索,如果包含一個名字為 id 的參數,Beautiful Soup會搜索每個tag的”id”屬性.

soup.find_all(id='link2') # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

如果傳入 href 參數,Beautiful Soup會搜索每個tag的”href”屬性:

soup.find_all(href=re.compile("elsie")) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

搜索指定名字的屬性時可以使用的參數值包括 字符串 , 正則表達式 , 列表, True .

下面的例子在文檔樹中查找所有包含 id 屬性的tag,無論 id 的值是什么:

soup.find_all(id=True) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

使用多個指定名字的參數可以同時過濾tag的多個屬性:

soup.find_all(href=re.compile("elsie"), id='link1') # [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]

有些tag屬性在搜索不能使用,比如HTML5中的 data-* 屬性:

data_soup = BeautifulSoup('<div data-foo="value">foo!</div>') data_soup.find_all(data-foo="value") # SyntaxError: keyword can't be an expression

但是可以通過 find_all() 方法的 attrs 參數定義一個字典參數來搜索包含特殊屬性的tag:

data_soup.find_all(attrs={"data-foo": "value"}) # [<div data-foo="value">foo!</div>]

按CSS搜索

按照CSS類名搜索tag的功能非常實用,但標識CSS類名的關鍵字 class 在Python中是保留字,使用 class 做參數會導致語法錯誤.從Beautiful Soup的4.1.1版本開始,可以通過 class_ 參數搜索有指定CSS類名的tag:

soup.find_all("a", class_="sister") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

class_ 參數同樣接受不同類型的 過濾器 ,字符串,正則表達式,方法或 True :

soup.find_all(class_=re.compile("itl")) # [<p class="title"><b>The Dormouse's story</b></p>] def has_six_characters(css_class): return css_class is not None and len(css_class) == 6 soup.find_all(class_=has_six_characters) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

tag的 class 屬性是 多值屬性 .按照CSS類名搜索tag時,可以分別搜索tag中的每個CSS類名:

css_soup = BeautifulSoup('<p class="body strikeout"></p>') css_soup.find_all("p", class_="strikeout") # [<p class="body strikeout"></p>] css_soup.find_all("p", class_="body") # [<p class="body strikeout"></p>]

搜索 class 屬性時也可以通過CSS值完全匹配:

css_soup.find_all("p", class_="body strikeout") # [<p class="body strikeout"></p>]

完全匹配 class 的值時,如果CSS類名的順序與實際不符,將搜索不到結果:

soup.find_all("a", attrs={"class": "sister"}) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

text 參數

通過 text 參數可以搜搜文檔中的字符串內容.與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表, True . 看例子:

soup.find_all(text="Elsie") # [u'Elsie']soup.find_all(text=["Tillie", "Elsie", "Lacie"]) # [u'Elsie', u'Lacie', u'Tillie']soup.find_all(text=re.compile("Dormouse")) [u"The Dormouse's story", u"The Dormouse's story"]def is_the_only_string_within_a_tag(s):""Return True if this string is the only child of its parent tag.""return (s == s.parent.string)soup.find_all(text=is_the_only_string_within_a_tag) # [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']

雖然 text 參數用于搜索字符串,還可以與其它參數混合使用來過濾tag.Beautiful Soup會找到 .string 方法與 text 參數值相符的tag.下面代碼用來搜索內容里面包含“Elsie”的<a>標簽:

soup.find_all("a", text="Elsie") # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]

limit 參數

find_all() 方法返回全部的搜索結構,如果文檔樹很大那么搜索會很慢.如果我們不需要全部結果,可以使用 limit 參數限制返回結果的數量.效果與SQL中的limit關鍵字類似,當搜索到的結果數量達到 limit 的限制時,就停止搜索返回結果.

文檔樹中有3個tag符合搜索條件,但結果只返回了2個,因為我們限制了返回數量:

soup.find_all("a", limit=2) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

recursive 參數

調用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的所有子孫節(jié)點,如果只想搜索tag的直接子節(jié)點,可以使用參數 recursive=False .

一段簡單的文檔:

<html><head><title>The Dormouse's story</title></head> ...

是否使用 recursive 參數的搜索結果:

soup.html.find_all("title") # [<title>The Dormouse's story</title>] soup.html.find_all("title", recursive=False) # []

像調用 find_all() 一樣調用tag

find_all() 幾乎是Beautiful Soup中最常用的搜索方法,所以我們定義了它的簡寫方法. BeautifulSoup 對象和 tag 對象可以被當作一個方法來使用,這個方法的執(zhí)行結果與調用這個對象的 find_all() 方法相同,下面兩行代碼是等價的:

soup.find_all("a") soup("a")

這兩行代碼也是等價的:

soup.title.find_all(text=True) soup.title(text=True)

find()

find( name , attrs , recursive , text , **kwargs )

find_all() 方法將返回文檔中符合條件的所有tag,盡管有時候我們只想得到一個結果.比如文檔中只有一個<body>標簽,那么使用 find_all() 方法來查找<body>標簽就不太合適, 使用 find_all 方法并設置 limit=1 參數不如直接使用 find() 方法.下面兩行代碼是等價的:

soup.find_all('title', limit=1) # [<title>The Dormouse's story</title>] soup.find('title') # <title>The Dormouse's story</title>

唯一的區(qū)別是 find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果.

find_all() 方法沒有找到目標是返回空列表, find() 方法找不到目標時,返回 None .

print(soup.find("nosuchtag")) # None

soup.head.title 是 tag的名字 方法的簡寫.這個簡寫的原理就是多次調用當前tag的 find() 方法:

soup.head.title # <title>The Dormouse's story</title> soup.find("head").find("title") # <title>The Dormouse's story</title>

find_parents() 和 find_parent()

find_parents( name , attrs , recursive , text , **kwargs )

find_parent( name , attrs , recursive , text , **kwargs )

我們已經用了很大篇幅來介紹 find_all()find() 方法,Beautiful Soup中還有10個用于搜索的API.它們中的五個用的是與 find_all() 相同的搜索參數,另外5個與 find() 方法的搜索參數類似.區(qū)別僅是它們搜索文檔的不同部分.

記住: find_all()find() 只搜索當前節(jié)點的所有子節(jié)點,孫子節(jié)點等. find_parents()find_parent() 用來搜索當前節(jié)點的父輩節(jié)點,搜索方法與普通tag的搜索方法相同,搜索文檔搜索文檔包含的內容. 我們從一個文檔中的一個葉子節(jié)點開始:

a_string = soup.find(text="Lacie") a_string # u'Lacie'a_string.find_parents("a") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]a_string.find_parent("p") # <p class="story">Once upon a time there were three little sisters; and their names were # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>; # and they lived at the bottom of a well.</p>a_string.find_parents("p", class="title") # []

文檔中的一個<a>標簽是是當前葉子節(jié)點的直接父節(jié)點,所以可以被找到.還有一個<p>標簽,是目標葉子節(jié)點的間接父輩節(jié)點,所以也可以被找到.包含class值為”title”的<p>標簽不是不是目標葉子節(jié)點的父輩節(jié)點,所以通過 find_parents() 方法搜索不到.

find_parent()find_parents() 方法會讓人聯想到 .parent 和 .parents 屬性.它們之間的聯系非常緊密.搜索父輩節(jié)點的方法實際上就是對 .parents 屬性的迭代搜索.

find_next_siblings() 合 find_next_sibling()

find_next_siblings( name , attrs , recursive , text , **kwargs )

find_next_sibling( name , attrs , recursive , text , **kwargs )

這2個方法通過 .next_siblings 屬性對當tag的所有后面解析 [5] 的兄弟tag節(jié)點進行迭代, find_next_siblings() 方法返回所有符合條件的后面的兄弟節(jié)點, find_next_sibling() 只返回符合條件的后面的第一個tag節(jié)點.

first_link = soup.a first_link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> first_link.find_next_siblings("a") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] first_story_paragraph = soup.find("p", "story") first_story_paragraph.find_next_sibling("p") # <p class="story">...</p>

find_previous_siblings() 和 find_previous_sibling()

find_previous_siblings( name , attrs , recursive , text , **kwargs )

find_previous_sibling( name , attrs , recursive , text , **kwargs )

這2個方法通過 .previous_siblings 屬性對當前tag的前面解析 [5] 的兄弟tag節(jié)點進行迭代, find_previous_siblings() 方法返回所有符合條件的前面的兄弟節(jié)點, find_previous_sibling() 方法返回第一個符合條件的前面的兄弟節(jié)點:

last_link = soup.find("a", id="link3") last_link # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> last_link.find_previous_siblings("a") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] first_story_paragraph = soup.find("p", "story") first_story_paragraph.find_previous_sibling("p") # <p class="title"><b>The Dormouse's story</b></p>

find_all_next() 和 find_next()

find_all_next( name , attrs , recursive , text , **kwargs )

find_next( name , attrs , recursive , text , **kwargs )

這2個方法通過 .next_elements 屬性對當前tag的之后的 [5] tag和字符串進行迭代, find_all_next() 方法返回所有符合條件的節(jié)點, find_next() 方法返回第一個符合條件的節(jié)點:

first_link = soup.a first_link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> first_link.find_all_next(text=True) # [u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie', # u';\nand they lived at the bottom of a well.', u'\n\n', u'...', u'\n'] first_link.find_next("p") # <p class="story">...</p>

第一個例子中,字符串 “Elsie”也被顯示出來,盡管它被包含在我們開始查找的<a>標簽的里面.第二個例子中,最后一個<p>標簽也被顯示出來,盡管它與我們開始查找位置的<a>標簽不屬于同一部分.例子中,搜索的重點是要匹配過濾器的條件,并且在文檔中出現的順序而不是開始查找的元素的位置.

find_all_previous() 和 find_previous()

find_all_previous( name , attrs , recursive , text , **kwargs )

find_previous( name , attrs , recursive , text , **kwargs )

這2個方法通過 .previous_elements 屬性對當前節(jié)點前面 [5] 的tag和字符串進行迭代, find_all_previous() 方法返回所有符合條件的節(jié)點, find_previous() 方法返回第一個符合條件的節(jié)點.

first_link = soup.a first_link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> first_link.find_all_previous("p") # [<p class="story">Once upon a time there were three little sisters; ...</p>, # <p class="title"><b>The Dormouse's story</b></p>] first_link.find_previous("title") # <title>The Dormouse's story</title>

find_all_previous("p") 返回了文檔中的第一段(class=”title”的那段),但還返回了第二段,<p>標簽包含了我們開始查找的<a>標簽.不要驚訝,這段代碼的功能是查找所有出現在指定<a>標簽之前的<p>標簽,因為這個<p>標簽包含了開始的<a>標簽,所以<p>標簽一定是在<a>之前出現的.

CSS選擇器

Beautiful Soup支持大部分的CSS選擇器 [6] ,在 TagBeautifulSoup 對象的 .select() 方法中傳入字符串參數,即可使用CSS選擇器的語法找到tag:

soup.select("title") # [<title>The Dormouse's story</title>] soup.select("p nth-of-type(3)") # [<p class="story">...</p>]

通過tag標簽逐層查找:

soup.select("body a") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("html head title") # [<title>The Dormouse's story</title>]

找到某個tag標簽下的直接子標簽 [6] :

soup.select("head > title") # [<title>The Dormouse's story</title>] soup.select("p > a") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("p > a:nth-of-type(2)") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] soup.select("p > #link1") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select("body > a") # []

找到兄弟節(jié)點標簽:

soup.select("#link1 ~ .sister") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("#link1 + .sister") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通過CSS的類名查找:

soup.select(".sister") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("[class~=sister]") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通過tag的id查找:

soup.select("#link1") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select("a#link2") # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通過是否存在某個屬性來查找:

soup.select('a[href]') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通過屬性的值來查找:

soup.select('a[href="http://example.com/elsie"]') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select('a[href^="http://example.com/"]') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select('a[href$="tillie"]') # [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select('a[href*=".com/el"]') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

通過語言設置來查找:

multilingual_markup = """ <p lang="en">Hello</p> <p lang="en-us">Howdy, y'all</p> <p lang="en-gb">Pip-pip, old fruit</p> <p lang="fr">Bonjour mes amis</p> """ multilingual_soup = BeautifulSoup(multilingual_markup) multilingual_soup.select('p[lang|=en]') # [<p lang="en">Hello</p>, # <p lang="en-us">Howdy, y'all</p>, # <p lang="en-gb">Pip-pip, old fruit</p>]

對于熟悉CSS選擇器語法的人來說這是個非常方便的方法.Beautiful Soup也支持CSS選擇器API,如果你僅僅需要CSS選擇器的功能,那么直接使用 lxml 也可以,而且速度更快,支持更多的CSS選擇器語法,但Beautiful Soup整合了CSS選擇器的語法和自身方便使用API.

修改文檔樹

Beautiful Soup的強項是文檔樹的搜索,但同時也可以方便的修改文檔樹

修改tag的名稱和屬性

在 Attributes 的章節(jié)中已經介紹過這個功能,但是再看一遍也無妨. 重命名一個tag,改變屬性的值,添加或刪除屬性:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') tag = soup.b tag.name = "blockquote" tag['class'] = 'verybold' tag['id'] = 1 tag # <blockquote class="verybold" id="1">Extremely bold</blockquote> del tag['class'] del tag['id'] tag # <blockquote>Extremely bold</blockquote>

修改 .string

給tag的 .string 屬性賦值,就相當于用當前的內容替代了原來的內容:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) tag = soup.a tag.string = "New link text." tag # <a href="http://example.com/">New link text.</a>

注意: 如果當前的tag包含了其它tag,那么給它的 .string 屬性賦值會覆蓋掉原有的所有內容包括子tag

append()

Tag.append() 方法想tag中添加內容,就好像Python的列表的 .append() 方法:

soup = BeautifulSoup("<a>Foo</a>") soup.a.append("Bar") soup # <html><head></head><body><a>FooBar</a></body></html> soup.a.contents # [u'Foo', u'Bar']

BeautifulSoup.new_string() 和 .new_tag()

如果想添加一段文本內容到文檔中也沒問題,可以調用Python的 append() 方法或調用工廠方法 BeautifulSoup.new_string() :

soup = BeautifulSoup("<b></b>") tag = soup.b tag.append("Hello") new_string = soup.new_string(" there") tag.append(new_string) tag # <b>Hello there.</b> tag.contents # [u'Hello', u' there']

如果想要創(chuàng)建一段注釋,或 NavigableString 的任何子類,將子類作為 new_string() 方法的第二個參數傳入:

from bs4 import Comment new_comment = soup.new_string("Nice to see you.", Comment) tag.append(new_comment) tag # <b>Hello there<!--Nice to see you.--></b> tag.contents # [u'Hello', u' there', u'Nice to see you.']

# 這是Beautiful Soup 4.2.1 中新增的方法

創(chuàng)建一個tag最好的方法是調用工廠方法 BeautifulSoup.new_tag() :

soup = BeautifulSoup("<b></b>") original_tag = soup.b new_tag = soup.new_tag("a", href="http://www.example.com") original_tag.append(new_tag) original_tag # <b><a href="http://www.example.com"></a></b> new_tag.string = "Link text." original_tag # <b><a href="http://www.example.com">Link text.</a></b>

第一個參數作為tag的name,是必填,其它參數選填

insert()

Tag.insert() 方法與 Tag.append() 方法類似,區(qū)別是不會把新元素添加到父節(jié)點 .contents 屬性的最后,而是把元素插入到指定的位置.與Python列表總的 .insert() 方法的用法下同:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) tag = soup.a tag.insert(1, "but did not endorse ") tag # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a> tag.contents # [u'I linked to ', u'but did not endorse', <i>example.com</i>]

insert_before() 和 insert_after()

insert_before() 方法在當前tag或文本節(jié)點前插入內容:

soup = BeautifulSoup("<b>stop</b>") tag = soup.new_tag("i") tag.string = "Don't" soup.b.string.insert_before(tag) soup.b # <b><i>Don't</i>stop</b>

insert_after() 方法在當前tag或文本節(jié)點后插入內容:

soup.b.i.insert_after(soup.new_string(" ever ")) soup.b # <b><i>Don't</i> ever stop</b> soup.b.contents # [<i>Don't</i>, u' ever ', u'stop']

clear()

Tag.clear() 方法移除當前tag的內容:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) tag = soup.a tag.clear() tag # <a href="http://example.com/"></a>

extract()

PageElement.extract() 方法將當前tag移除文檔樹,并作為方法結果返回:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a i_tag = soup.i.extract() a_tag # <a href="http://example.com/">I linked to</a> i_tag # <i>example.com</i> print(i_tag.parent) None

這個方法實際上產生了2個文檔樹: 一個是用來解析原始文檔的 BeautifulSoup 對象,另一個是被移除并且返回的tag.被移除并返回的tag可以繼續(xù)調用 extract 方法:

my_string = i_tag.string.extract() my_string # u'example.com' print(my_string.parent) # None i_tag # <i></i>

decompose()

Tag.decompose() 方法將當前節(jié)點移除文檔樹并完全銷毀:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a soup.i.decompose() a_tag # <a href="http://example.com/">I linked to</a>

replace_with()

PageElement.replace_with() 方法移除文檔樹中的某段內容,并用新tag或文本節(jié)點替代它:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a new_tag = soup.new_tag("b") new_tag.string = "example.net" a_tag.i.replace_with(new_tag) a_tag # <a href="http://example.com/">I linked to <b>example.net</b></a>

replace_with() 方法返回被替代的tag或文本節(jié)點,可以用來瀏覽或添加到文檔樹其它地方

wrap()

PageElement.wrap() 方法可以對指定的tag元素進行包裝 [8] ,并返回包裝后的結果:

soup = BeautifulSoup("<p>I wish I was bold.</p>") soup.p.string.wrap(soup.new_tag("b")) # <b>I wish I was bold.</b> soup.p.wrap(soup.new_tag("div")) # <div><p><b>I wish I was bold.</b></p></div>

該方法在 Beautiful Soup 4.0.5 中添加

unwrap()

Tag.unwrap() 方法與 wrap() 方法相反.將移除tag內的所有tag標簽,該方法常被用來進行標記的解包:

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a a_tag.i.unwrap() a_tag # <a href="http://example.com/">I linked to example.com</a>

replace_with() 方法相同, unwrap() 方法返回被移除的tag

輸出

格式化輸出

prettify() 方法將Beautiful Soup的文檔樹格式化后以Unicode編碼輸出,每個XML/HTML標簽都獨占一行

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) soup.prettify() # '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...' print(soup.prettify()) # <html> # <head> # </head> # <body> # <a href="http://example.com/"> # I linked to # <i> # example.com # </i> # </a> # </body> # </html>

BeautifulSoup 對象和它的tag節(jié)點都可以調用 prettify() 方法:

print(soup.a.prettify()) # <a href="http://example.com/"> # I linked to # <i> # example.com # </i> # </a>

壓縮輸出

如果只想得到結果字符串,不重視格式,那么可以對一個 BeautifulSoup 對象或 Tag 對象使用Python的 unicode()str() 方法:

str(soup) # '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'unicode(soup.a) # u'<a href="http://example.com/">I linked to <i>example.com</i></a>'

str() 方法返回UTF-8編碼的字符串,可以指定 編碼 的設置.

還可以調用 encode() 方法獲得字節(jié)碼或調用 decode() 方法獲得Unicode.

輸出格式

Beautiful Soup輸出是會將HTML中的特殊字符轉換成Unicode,比如“&lquot;”:

soup = BeautifulSoup("&ldquo;Dammit!&rdquo; he said.") unicode(soup) # u'<html><head></head><body>\u201cDammit!\u201d he said.</body></html>'

如果將文檔轉換成字符串,Unicode編碼會被編碼成UTF-8.這樣就無法正確顯示HTML特殊字符了:

str(soup) # '<html><head></head><body>\xe2\x80\x9cDammit!\xe2\x80\x9d he said.</body></html>'

get_text()

如果只想得到tag中包含的文本內容,那么可以嗲用 get_text() 方法,這個方法獲取到tag中包含的所有文版內容包括子孫tag中的內容,并將結果作為Unicode字符串返回:

markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>' soup = BeautifulSoup(markup) soup.get_text() u'\nI linked to example.com\n' soup.i.get_text() u'example.com'

可以通過參數指定tag的文本內容的分隔符:

# soup.get_text("|") u'\nI linked to |example.com|\n'

還可以去除獲得文本內容的前后空白:

# soup.get_text("|", strip=True) u'I linked to|example.com'

或者使用 .stripped_strings 生成器,獲得文本列表后手動處理列表:

[text for text in soup.stripped_strings] # [u'I linked to', u'example.com']

指定文檔解析器

如果僅是想要解析HTML文檔,只要用文檔創(chuàng)建 BeautifulSoup 對象就可以了.Beautiful Soup會自動選擇一個解析器來解析文檔.但是還可以通過參數指定使用那種解析器來解析當前文檔.

BeautifulSoup 第一個參數應該是要被解析的文檔字符串或是文件句柄,第二個參數用來標識怎樣解析文檔.如果第二個參數為空,那么Beautiful Soup根據當前系統(tǒng)安裝的庫自動選擇解析器,解析器的優(yōu)先數序: lxml, html5lib, Python標準庫.在下面兩種條件下解析器優(yōu)先順序會變化:

  • 要解析的文檔是什么類型: 目前支持, “html”, “xml”, 和 “html5”
  • 指定使用哪種解析器: 目前支持, “l(fā)xml”, “html5lib”, 和 “html.parser”

安裝解析器 章節(jié)介紹了可以使用哪種解析器,以及如何安裝.

如果指定的解析器沒有安裝,Beautiful Soup會自動選擇其它方案.目前只有 lxml 解析器支持XML文檔的解析,在沒有安裝lxml庫的情況下,創(chuàng)建 beautifulsoup 對象時無論是否指定使用lxml,都無法得到解析后的對象

解析器之間的區(qū)別

Beautiful Soup為不同的解析器提供了相同的接口,但解析器本身時有區(qū)別的.同一篇文檔被不同的解析器解析后可能會生成不同結構的樹型文檔.區(qū)別最大的是HTML解析器和XML解析器,看下面片段被解析成HTML結構:

BeautifulSoup("<a><b /></a>") # <html><head></head><body><a><b></b></a></body></html>

因為空標簽<b />不符合HTML標準,所以解析器把它解析成<b></b>

同樣的文檔使用XML解析如下(解析XML需要安裝lxml庫).注意,空標簽<b />依然被保留,并且文檔前添加了XML頭,而不是被包含在<html>標簽內:

BeautifulSoup("<a><b /></a>", "xml") # <?xml version="1.0" encoding="utf-8"?> # <a><b/></a>

HTML解析器之間也有區(qū)別,如果被解析的HTML文檔是標準格式,那么解析器之間沒有任何差別,只是解析速度不同,結果都會返回正確的文檔樹.

但是如果被解析文檔不是標準格式,那么不同的解析器返回結果可能不同.下面例子中,使用lxml解析錯誤格式的文檔,結果</p>標簽被直接忽略掉了:

BeautifulSoup("<a></p>", "lxml") # <html><body><a></a></body></html>

使用html5lib庫解析相同文檔會得到不同的結果:

BeautifulSoup("<a></p>", "html5lib") # <html><head></head><body><a><p></p></a></body></html>

html5lib庫沒有忽略掉</p>標簽,而是自動補全了標簽,還給文檔樹添加了<head>標簽.

使用pyhton內置庫解析結果如下:

BeautifulSoup("<a></p>", "html.parser") # <a></a>

與lxml [7] 庫類似的,Python內置庫忽略掉了</p>標簽,與html5lib庫不同的是標準庫沒有嘗試創(chuàng)建符合標準的文檔格式或將文檔片段包含在<body>標簽內,與lxml不同的是標準庫甚至連<html>標簽都沒有嘗試去添加.

因為文檔片段“<a></p>”是錯誤格式,所以以上解析方式都能算作”正確”,html5lib庫使用的是HTML5的部分標準,所以最接近”正確”.不過所有解析器的結構都能夠被認為是”正常”的.

不同的解析器可能影響代碼執(zhí)行結果,如果在分發(fā)給別人的代碼中使用了 BeautifulSoup ,那么最好注明使用了哪種解析器,以減少不必要的麻煩.

編碼

任何HTML或XML文檔都有自己的編碼方式,比如ASCII 或 UTF-8,但是使用Beautiful Soup解析后,文檔都被轉換成了Unicode:

markup = "<h1>Sacr\xc3\xa9 bleu!</h1>" soup = BeautifulSoup(markup) soup.h1 # <h1>Sacré bleu!</h1> soup.h1.string # u'Sacr\xe9 bleu!'

這不是魔術(但很神奇),Beautiful Soup用了 編碼自動檢測 子庫來識別當前文檔編碼并轉換成Unicode編碼. BeautifulSoup 對象的 .original_encoding 屬性記錄了自動識別編碼的結果:

soup.original_encoding 'utf-8'

編碼自動檢測 功能大部分時候都能猜對編碼格式,但有時候也會出錯.有時候即使猜測正確,也是在逐個字節(jié)的遍歷整個文檔后才猜對的,這樣很慢.如果預先知道文檔編碼,可以設置編碼參數來減少自動檢查編碼出錯的概率并且提高文檔解析速度.在創(chuàng)建 BeautifulSoup 對象的時候設置 from_encoding 參數.

下面一段文檔用了ISO-8859-8編碼方式,這段文檔太短,結果Beautiful Soup以為文檔是用ISO-8859-7編碼:

markup = b"<h1>\xed\xe5\xec\xf9</h1>" soup = BeautifulSoup(markup) soup.h1 <h1>νεμω</h1> soup.original_encoding 'ISO-8859-7'

通過傳入 from_encoding 參數來指定編碼方式:

soup = BeautifulSoup(markup, from_encoding="iso-8859-8") soup.h1 <h1>????</h1> soup.original_encoding 'iso8859-8'

少數情況下(通常是UTF-8編碼的文檔中包含了其它編碼格式的文件),想獲得正確的Unicode編碼就不得不將文檔中少數特殊編碼字符替換成特殊Unicode編碼,“REPLACEMENT CHARACTER” (U+FFFD, �) [9] . 如果Beautifu Soup猜測文檔編碼時作了特殊字符的替換,那么Beautiful Soup會把 UnicodeDammitBeautifulSoup 對象的 .contains_replacement_characters 屬性標記為 True .這樣就可以知道當前文檔進行Unicode編碼后丟失了一部分特殊內容字符.如果文檔中包含�而 .contains_replacement_characters 屬性是 False ,則表示�就是文檔中原來的字符,不是轉碼失敗.

輸出編碼

通過Beautiful Soup輸出文檔時,不管輸入文檔是什么編碼方式,輸出編碼均為UTF-8編碼,下面例子輸入文檔是Latin-1編碼:

markup = b''' <html> <head> <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" /> </head> <body> <p>Sacr\xe9 bleu!</p> </body> </html> ''' soup = BeautifulSoup(markup) print(soup.prettify()) # <html> # <head> # <meta content="text/html; charset=utf-8" http-equiv="Content-type" /> # </head> # <body> # <p> # Sacré bleu! # </p> # </body> # </html>

注意,輸出文檔中的<meta>標簽的編碼設置已經修改成了與輸出編碼一致的UTF-8.

如果不想用UTF-8編碼輸出,可以將編碼方式傳入 prettify() 方法:

print(soup.prettify("latin-1")) # <html> # <head> # <meta content="text/html; charset=latin-1" http-equiv="Content-type" /> # ...

還可以調用 BeautifulSoup 對象或任意節(jié)點的 encode() 方法,就像Python的字符串調用 encode() 方法一樣:

soup.p.encode("latin-1") # '<p>Sacr\xe9 bleu!</p>' soup.p.encode("utf-8") # '<p>Sacr\xc3\xa9 bleu!</p>'

如果文檔中包含當前編碼不支持的字符,那么這些字符將唄轉換成一系列XML特殊字符引用,下面例子中包含了Unicode編碼字符SNOWMAN:

markup = u"<b>\N{SNOWMAN}</b>" snowman_soup = BeautifulSoup(markup) tag = snowman_soup.b

SNOWMAN字符在UTF-8編碼中可以正常顯示(看上去像是?),但有些編碼不支持SNOWMAN字符,比如ISO-Latin-1或ASCII,那么在這些編碼中SNOWMAN字符會被轉換成“&#9731”:

print(tag.encode("utf-8")) # <b>?</b> print tag.encode("latin-1") # <b>&#9731;</b> print tag.encode("ascii") # <b>&#9731;</b>

Unicode, dammit! (靠!)

編碼自動檢測 功能可以在Beautiful Soup以外使用,檢測某段未知編碼時,可以使用這個方法:

from bs4 import UnicodeDammit dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!") print(dammit.unicode_markup) # Sacré bleu! dammit.original_encoding # 'utf-8'

如果Python中安裝了 chardetcchardet 那么編碼檢測功能的準確率將大大提高.輸入的字符越多,檢測結果越精確,如果事先猜測到一些可能編碼,那么可以將猜測的編碼作為參數,這樣將優(yōu)先檢測這些編碼:

dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"]) print(dammit.unicode_markup) # Sacré bleu! dammit.original_encoding # 'latin-1'

編碼自動檢測 功能中有2項功能是Beautiful Soup庫中用不到的

智能引號

使用Unicode時,Beautiful Soup還會智能的把引號 [10] 轉換成HTML或XML中的特殊字符:

markup = b"<p>I just \x93love\x94 Microsoft Word\x92s smart quotes</p>" UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="html").unicode_markup # u'<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>' UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="xml").unicode_markup # u'<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'

也可以把引號轉換為ASCII碼:

UnicodeDammit(markup, ["windows-1252"], smart_quotes_to="ascii").unicode_markup # u'<p>I just "love" Microsoft Word\'s smart quotes</p>'

很有用的功能,但是Beautiful Soup沒有使用這種方式.默認情況下,Beautiful Soup把引號轉換成Unicode:

UnicodeDammit(markup, ["windows-1252"]).unicode_markup # u'<p>I just \u201clove\u201d Microsoft Word\u2019s smart quotes</p>'

矛盾的編碼

有時文檔的大部分都是用UTF-8,但同時還包含了Windows-1252編碼的字符,就像微軟的智能引號 [10] 一樣.一些包含多個信息的來源網站容易出現這種情況. UnicodeDammit.detwingle() 方法可以把這類文檔轉換成純UTF-8編碼格式,看個簡單的例子:

snowmen = (u"\N{SNOWMAN}" * 3) quote = (u"\N{LEFT DOUBLE QUOTATION MARK}I like snowmen!\N{RIGHT DOUBLE QUOTATION MARK}") doc = snowmen.encode("utf8") + quote.encode("windows_1252")

這段文檔很雜亂,snowmen是UTF-8編碼,引號是Windows-1252編碼,直接輸出時不能同時顯示snowmen和引號,因為它們編碼不同:

print(doc) # ???�I like snowmen!�print(doc.decode("windows-1252")) # a??a??a??“I like snowmen!”

如果對這段文檔用UTF-8解碼就會得到 UnicodeDecodeError 異常,如果用Windows-1252解碼就回得到一堆亂碼.幸好, UnicodeDammit.detwingle() 方法會吧這段字符串轉換成UTF-8編碼,允許我們同時顯示出文檔中的snowmen和引號:

new_doc = UnicodeDammit.detwingle(doc) print(new_doc.decode("utf8")) # ???“I like snowmen!”

UnicodeDammit.detwingle() 方法只能解碼包含在UTF-8編碼中的Windows-1252編碼內容,但這解決了最常見的一類問題.

在創(chuàng)建 BeautifulSoupUnicodeDammit 對象前一定要先對文檔調用 UnicodeDammit.detwingle() 確保文檔的編碼方式正確.如果嘗試去解析一段包含Windows-1252編碼的UTF-8文檔,就會得到一堆亂碼,比如: a??a??a??“I like snowmen!”.

UnicodeDammit.detwingle() 方法在Beautiful Soup 4.1.0版本中新增

解析部分文檔

如果僅僅因為想要查找文檔中的<a>標簽而將整片文檔進行解析,實在是浪費內存和時間.最快的方法是從一開始就把<a>標簽以外的東西都忽略掉. SoupStrainer 類可以定義文檔的某段內容,這樣搜索文檔時就不必先解析整篇文檔,只會解析在 SoupStrainer 中定義過的文檔. 創(chuàng)建一個 SoupStrainer 對象并作為 parse_only 參數給 BeautifulSoup 的構造方法即可.

SoupStrainer

SoupStrainer 類接受與典型搜索方法相同的參數:name , attrs , recursive , text , **kwargs 。下面舉例說明三種 SoupStrainer 對象:

from bs4 import SoupStraineronly_a_tags = SoupStrainer("a") only_tags_with_id_link2 = SoupStrainer(id="link2") def is_short_string(string): return len(string) < 10 only_short_strings = SoupStrainer(text=is_short_string)

再拿“愛麗絲”文檔來舉例,來看看使用三種 SoupStrainer 對象做參數會有什么不同:

html_doc = """ <html><head><title>The Dormouse's story</title></head><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify()) # <a class="sister" href="http://example.com/elsie" id="link1"> # Elsie # </a> # <a class="sister" href="http://example.com/lacie" id="link2"> # Lacie # </a> # <a class="sister" href="http://example.com/tillie" id="link3"> # Tillie # </a> print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify()) # <a class="sister" href="http://example.com/lacie" id="link2"> # Lacie # </a> print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify()) # Elsie # , # Lacie # and # Tillie # ... #

還可以將 SoupStrainer 作為參數傳入 搜索文檔樹 中提到的方法.這可能不是個常用用法,所以還是提一下:

soup = BeautifulSoup(html_doc) soup.find_all(only_short_strings) # [u'\n\n', u'\n\n', u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie', # u'\n\n', u'...', u'\n']

常見問題

代碼診斷

如果想知道Beautiful Soup到底怎樣處理一份文檔,可以將文檔傳入 diagnose() 方法(Beautiful Soup 4.2.0中新增),Beautiful Soup會輸出一份報告,說明不同的解析器會怎樣處理這段文檔,并標出當前的解析過程會使用哪種解析器:

from bs4.diagnose import diagnose data = open("bad.html").read() diagnose(data) # Diagnostic running on Beautiful Soup 4.2.0 # Python version 2.7.3 (default, Aug 1 2012, 05:16:07) # I noticed that html5lib is not installed. Installing it may help. # Found lxml version 2.3.2.0 # # Trying to parse your data with html.parser # Here's what html.parser did with the document: # ...

diagnose() 方法的輸出結果可能幫助你找到問題的原因,如果不行,還可以把結果復制出來以便尋求他人的幫助

文檔解析錯誤

文檔解析錯誤有兩種.一種是崩潰,Beautiful Soup嘗試解析一段文檔結果卻拋除了異常,通常是 HTMLParser.HTMLParseError .還有一種異常情況,是Beautiful Soup解析后的文檔樹看起來與原來的內容相差很多.

這些錯誤幾乎都不是Beautiful Soup的原因,這不會是因為Beautiful Soup得代碼寫的太優(yōu)秀,而是因為Beautiful Soup沒有包含任何文檔解析代碼.異常產生自被依賴的解析器,如果解析器不能很好的解析出當前的文檔,那么最好的辦法是換一個解析器.更多細節(jié)查看 安裝解析器 章節(jié).

最常見的解析錯誤是 HTMLParser.HTMLParseError: malformed start tagHTMLParser.HTMLParseError: bad end tag .這都是由Python內置的解析器引起的,解決方法是 安裝lxml或html5lib

最常見的異常現象是當前文檔找不到指定的Tag,而這個Tag光是用眼睛就足夠發(fā)現的了. find_all() 方法返回 [] ,而 find() 方法返回 None .這是Python內置解析器的又一個問題: 解析器會跳過那些它不知道的tag.解決方法還是 安裝lxml或html5lib

版本錯誤

  • SyntaxError: Invalid syntax (異常位置在代碼行: ROOT_TAG_NAME = u'[document]' ),因為Python2版本的代碼沒有經過遷移就在Python3中窒息感
  • ImportError: No module named HTMLParser 因為在Python3中執(zhí)行Python2版本的Beautiful Soup
  • ImportError: No module named html.parser 因為在Python2中執(zhí)行Python3版本的Beautiful Soup
  • ImportError: No module named BeautifulSoup 因為在沒有安裝BeautifulSoup3庫的Python環(huán)境下執(zhí)行代碼,或忘記了BeautifulSoup4的代碼需要從 bs4 包中引入
  • ImportError: No module named bs4 因為當前Python環(huán)境下還沒有安裝BeautifulSoup4

解析成XML

默認情況下,Beautiful Soup會將當前文檔作為HTML格式解析,如果要解析XML文檔,要在 BeautifulSoup 構造方法中加入第二個參數 “xml”:

soup = BeautifulSoup(markup, "xml")

當然,還需要 安裝lxml

解析器的錯誤

  • 如果同樣的代碼在不同環(huán)境下結果不同,可能是因為兩個環(huán)境下使用不同的解析器造成的.例如這個環(huán)境中安裝了lxml,而另一個環(huán)境中只有html5lib, 解析器之間的區(qū)別 中說明了原因.修復方法是在 BeautifulSoup 的構造方法中中指定解析器
  • 因為HTML標簽是 大小寫敏感 的,所以3種解析器再出來文檔時都將tag和屬性轉換成小寫.例如文檔中的 <TAG></TAG> 會被轉換為 <tag></tag> .如果想要保留tag的大寫的話,那么應該將文檔 解析成XML .

雜項錯誤

  • UnicodeEncodeError: 'charmap' codec can't encode character u'\xfoo' in position bar (或其它類型的 UnicodeEncodeError )的錯誤,主要是兩方面的錯誤(都不是Beautiful Soup的原因),第一種是正在使用的終端(console)無法顯示部分Unicode,參考 Python wiki ,第二種是向文件寫入時,被寫入文件不支持部分Unicode,這時只要用 u.encode("utf8") 方法將編碼轉換為UTF-8.
  • KeyError: [attr] 因為調用 tag['attr'] 方法而引起,因為這個tag沒有定義該屬性.出錯最多的是 KeyError: 'href'KeyError: 'class' .如果不確定某個屬性是否存在時,用 tag.get('attr') 方法去獲取它,跟獲取Python字典的key一樣
  • AttributeError: 'ResultSet' object has no attribute 'foo' 錯誤通常是因為把 find_all() 的返回結果當作一個tag或文本節(jié)點使用,實際上返回結果是一個列表或 ResultSet 對象的字符串,需要對結果進行循環(huán)才能得到每個節(jié)點的 .foo 屬性.或者使用 find() 方法僅獲取到一個節(jié)點
  • AttributeError: 'NoneType' object has no attribute 'foo' 這個錯誤通常是在調用了 find() 方法后直節(jié)點取某個屬性 .foo 但是 find() 方法并沒有找到任何結果,所以它的返回值是 None .需要找出為什么 find() 的返回值是 None .

如何提高效率

Beautiful Soup對文檔的解析速度不會比它所依賴的解析器更快,如果對計算時間要求很高或者計算機的時間比程序員的時間更值錢,那么就應該直接使用 lxml .

換句話說,還有提高Beautiful Soup效率的辦法,使用lxml作為解析器.Beautiful Soup用lxml做解析器比用html5lib或Python內置解析器速度快很多.

安裝 cchardet 后文檔的解碼的編碼檢測會速度更快

解析部分文檔 不會節(jié)省多少解析時間,但是會節(jié)省很多內存,并且搜索時也會變得更快.

Beautiful Soup 3

Beautiful Soup 3是上一個發(fā)布版本,目前已經停止維護.Beautiful Soup 3庫目前已經被幾個主要的linux平臺添加到源里:

$ apt-get install Python-beautifulsoup

在PyPi中分發(fā)的包名字是 BeautifulSoup :

$ easy_install BeautifulSoup

$ pip install BeautifulSoup

或通過 Beautiful Soup 3.2.0源碼包 安裝

Beautiful Soup 3的在線文檔查看 這里 ,當然還有 中文版 ,然后再讀本片文檔,來對比Beautiful Soup 4中有什新變化.

遷移到BS4

只要一個小變動就能讓大部分的Beautiful Soup 3代碼使用Beautiful Soup 4的庫和方法—-修改 BeautifulSoup 對象的引入方式:

from BeautifulSoup import BeautifulSoup

修改為:

from bs4 import BeautifulSoup
  • 如果代碼拋出 ImportError 異常“No module named BeautifulSoup”,原因可能是嘗試執(zhí)行Beautiful Soup 3,但環(huán)境中只安裝了Beautiful Soup 4庫
  • 如果代碼跑出 ImportError 異常“No module named bs4”,原因可能是嘗試運行Beautiful Soup 4的代碼,但環(huán)境中只安裝了Beautiful Soup 3.

雖然BS4兼容絕大部分BS3的功能,但BS3中的大部分方法已經不推薦使用了,就方法按照 PEP8標準 重新定義了方法名.很多方法都重新定義了方法名,但只有少數幾個方法沒有向下兼容.

上述內容就是BS3遷移到BS4的注意事項

需要的解析器

Beautiful Soup 3曾使用Python的 SGMLParser 解析器,這個模塊在Python3中已經被移除了.Beautiful Soup 4默認使用系統(tǒng)的 html.parser ,也可以使用lxml或html5lib擴展庫代替.查看 安裝解析器 章節(jié)

因為 html.parser 解析器與 SGMLParser 解析器不同,它們在處理格式不正確的文檔時也會產生不同結果.通常 html.parser 解析器會拋出異常.所以推薦安裝擴展庫作為解析器.有時 html.parser 解析出的文檔樹結構與 SGMLParser 的不同.如果發(fā)生這種情況,那么需要升級BS3來處理新的文檔樹.

方法名的變化

  • renderContents -> encode_contents
  • replaceWith -> replace_with
  • replaceWithChildren -> unwrap
  • findAll -> find_all
  • findAllNext -> find_all_next
  • findAllPrevious -> find_all_previous
  • findNext -> find_next
  • findNextSibling -> find_next_sibling
  • findNextSiblings -> find_next_siblings
  • findParent -> find_parent
  • findParents -> find_parents
  • findPrevious -> find_previous
  • findPreviousSibling -> find_previous_sibling
  • findPreviousSiblings -> find_previous_siblings
  • nextSibling -> next_sibling
  • previousSibling -> previous_sibling

Beautiful Soup構造方法的參數部分也有名字變化:

  • BeautifulSoup(parseOnlyThese=...) -> BeautifulSoup(parse_only=...)
  • BeautifulSoup(fromEncoding=...) -> BeautifulSoup(from_encoding=...)

為了適配Python3,修改了一個方法名:

  • Tag.has_key() -> Tag.has_attr()

修改了一個屬性名,讓它看起來更專業(yè)點:

  • Tag.isSelfClosing -> Tag.is_empty_element

修改了下面3個屬性的名字,以免雨Python保留字沖突.這些變動不是向下兼容的,如果在BS3中使用了這些屬性,那么在BS4中這些代碼無法執(zhí)行.

  • UnicodeDammit.Unicode -> UnicodeDammit.Unicode_markup``
  • Tag.next -> Tag.next_element
  • Tag.previous -> Tag.previous_element

生成器

將下列生成器按照PEP8標準重新命名,并轉換成對象的屬性:

  • childGenerator() -> children
  • nextGenerator() -> next_elements
  • nextSiblingGenerator() -> next_siblings
  • previousGenerator() -> previous_elements
  • previousSiblingGenerator() -> previous_siblings
  • recursiveChildGenerator() -> descendants
  • parentGenerator() -> parents

所以遷移到BS4版本時要替換這些代碼:

for parent in tag.parentGenerator(): ...

替換為:

for parent in tag.parents: ...

(兩種調用方法現在都能使用)

BS3中有的生成器循環(huán)結束后會返回 None 然后結束.這是個bug.新版生成器不再返回 None .

BS4中增加了2個新的生成器, .strings 和 stripped_strings . .strings 生成器返回NavigableString對象, .stripped_strings 方法返回去除前后空白的Python的string對象.

XML

BS4中移除了解析XML的 BeautifulStoneSoup 類.如果要解析一段XML文檔,使用 BeautifulSoup 構造方法并在第二個參數設置為“xml”.同時 BeautifulSoup 構造方法也不再識別 isHTML 參數.

Beautiful Soup處理XML空標簽的方法升級了.舊版本中解析XML時必須指明哪個標簽是空標簽. 構造方法的 selfClosingTags 參數已經不再使用.新版Beautiful Soup將所有空標簽解析為空元素,如果向空元素中添加子節(jié)點,那么這個元素就不再是空元素了.

實體

HTML或XML實體都會被解析成Unicode字符,Beautiful Soup 3版本中有很多處理實體的方法,在新版中都被移除了. BeautifulSoup 構造方法也不再接受 smartQuotesToconvertEntities 參數. 編碼自動檢測 方法依然有 smart_quotes_to 參數,但是默認會將引號轉換成Unicode.內容配置項 HTML_ENTITIES , XML_ENTITIESXHTML_ENTITIES 在新版中被移除.因為它們代表的特性已經不再被支持.

如果在輸出文檔時想把Unicode字符轉換成HTML實體,而不是輸出成UTF-8編碼,那就需要用到 輸出格式 的方法.

遷移雜項

Tag.string 屬性現在是一個遞歸操作.如果A標簽只包含了一個B標簽,那么A標簽的.string屬性值與B標簽的.string屬性值相同.

多值屬性 比如 class 屬性包含一個他們的值的列表,而不是一個字符串.這可能會影響到如何按照CSS類名哦搜索tag.

如果使用 find* 方法時同時傳入了 text 參數 和 name 參數 .Beautiful Soup會搜索指定name的tag,并且這個tag的 Tag.string 屬性包含text參數的內容.結果中不會包含字符串本身.舊版本中Beautiful Soup會忽略掉tag參數,只搜索text參數.

BeautifulSoup 構造方法不再支持 markupMassage 參數.現在由解析器負責文檔的解析正確性.

很少被用到的幾個解析器方法在新版中被移除,比如 ICantBelieveItsBeautifulSoupBeautifulSOAP .現在由解析器完全負責如何解釋模糊不清的文檔標記.

prettify() 方法在新版中返回Unicode字符串,不再返回字節(jié)流.

BeautifulSoup3 文檔

[1]BeautifulSoup的google討論組不是很活躍,可能是因為庫已經比較完善了吧,但是作者還是會很熱心的盡量幫你解決問題的.
[2](1, 2) 文檔被解析成樹形結構,所以下一步解析過程應該是當前節(jié)點的子節(jié)點
[3]過濾器只能作為搜索文檔的參數,或者說應該叫參數類型更為貼切,原文中用了 filter 因此翻譯為過濾器
[4]元素參數,HTML文檔中的一個tag節(jié)點,不能是文本節(jié)點
[5](1, 2, 3, 4, 5) 采用先序遍歷方式
[6](1, 2) CSS選擇器是一種單獨的文檔搜索語法, 參考 http://www.w3school.com.cn/css/css_selector_type.asp
[7]原文寫的是 html5lib, 譯者覺得這是愿文檔的一個筆誤
[8]wrap含有包裝,打包的意思,但是這里的包裝不是在外部包裝而是將當前tag的內部內容包裝在一個tag里.包裝原來內容的新tag依然在執(zhí)行 wrap() 方法的tag內
[9]文檔中特殊編碼字符被替換成特殊字符(通常是�)的過程是Beautful Soup自動實現的,如果想要多種編碼格式的文檔被完全轉換正確,那么,只好,預先手動處理,統(tǒng)一編碼格式
[10](1, 2) 智能引號,常出現在microsoft的word軟件中,即在某一段落中按引號出現的順序每個引號都被自動轉換為左引號,或右引號.

轉載于:https://www.cnblogs.com/zhuzhubaoya/p/9229335.html

總結

以上是生活随笔為你收集整理的【python】BeautifulSoup的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

免费播放一区二区三区 | 99国产欧美久久久精品 | 国产黑色丝袜在线播放 | 久久久久成人片免费观看蜜芽 | 国产精品内射视频免费 | 一本大道伊人av久久综合 | 色诱久久久久综合网ywww | 1000部夫妻午夜免费 | 丰满人妻精品国产99aⅴ | 激情亚洲一区国产精品 | 国内少妇偷人精品视频 | 狂野欧美性猛交免费视频 | 色老头在线一区二区三区 | 好男人www社区 | 对白脏话肉麻粗话av | 天天躁夜夜躁狠狠是什么心态 | 精品国产一区二区三区av 性色 | 精品aⅴ一区二区三区 | 国产后入清纯学生妹 | 日日碰狠狠躁久久躁蜜桃 | 亚洲色欲久久久综合网东京热 | 高清国产亚洲精品自在久久 | 在线亚洲高清揄拍自拍一品区 | 亚洲精品国产精品乱码不卡 | 欧美怡红院免费全部视频 | 国内丰满熟女出轨videos | 中文字幕人妻无码一区二区三区 | 久久久久国色av免费观看性色 | 撕开奶罩揉吮奶头视频 | 婷婷色婷婷开心五月四房播播 | 日韩在线不卡免费视频一区 | 一个人看的www免费视频在线观看 | 大肉大捧一进一出好爽视频 | 综合激情五月综合激情五月激情1 | 成人亚洲精品久久久久软件 | 亚洲区小说区激情区图片区 | 亚洲精品国偷拍自产在线麻豆 | 国产精品亚洲lv粉色 | 日韩在线不卡免费视频一区 | 麻花豆传媒剧国产免费mv在线 | 乱码av麻豆丝袜熟女系列 | 国产麻豆精品精东影业av网站 | 日韩精品无码一区二区中文字幕 | 国产真实伦对白全集 | 久久综合给久久狠狠97色 | 亲嘴扒胸摸屁股激烈网站 | 日本xxxx色视频在线观看免费 | 日本一区二区三区免费播放 | 又湿又紧又大又爽a视频国产 | 久久综合激激的五月天 | 蜜桃视频韩日免费播放 | 影音先锋中文字幕无码 | 国产亚洲精品久久久久久久 | 亚洲一区二区三区在线观看网站 | 欧美人与动性行为视频 | 国产熟妇高潮叫床视频播放 | 国产精品自产拍在线观看 | 中文字幕 亚洲精品 第1页 | 精品欧洲av无码一区二区三区 | 5858s亚洲色大成网站www | 欧美人与善在线com | 大肉大捧一进一出好爽视频 | 激情人妻另类人妻伦 | 中文字幕av无码一区二区三区电影 | √天堂资源地址中文在线 | 1000部夫妻午夜免费 | aⅴ在线视频男人的天堂 | 全黄性性激高免费视频 | 欧美国产日韩亚洲中文 | 亚洲国产成人a精品不卡在线 | 夜精品a片一区二区三区无码白浆 | 少妇人妻大乳在线视频 | 国产午夜手机精彩视频 | 欧美乱妇无乱码大黄a片 | 亚洲熟妇色xxxxx亚洲 | 亚洲 高清 成人 动漫 | 中文字幕av日韩精品一区二区 | 国产成人一区二区三区在线观看 | 大地资源网第二页免费观看 | 精品一二三区久久aaa片 | 内射白嫩少妇超碰 | 久久午夜夜伦鲁鲁片无码免费 | 欧美国产亚洲日韩在线二区 | 婷婷色婷婷开心五月四房播播 | 性欧美疯狂xxxxbbbb | 久久精品国产99久久6动漫 | 丰满肥臀大屁股熟妇激情视频 | 青青青爽视频在线观看 | 国产小呦泬泬99精品 | 欧美日韩一区二区免费视频 | 国色天香社区在线视频 | 奇米影视7777久久精品 | 久久久www成人免费毛片 | 高潮毛片无遮挡高清免费 | 野外少妇愉情中文字幕 | 日韩无套无码精品 | 无码人妻精品一区二区三区下载 | 国产黄在线观看免费观看不卡 | 国产亲子乱弄免费视频 | 国产色在线 | 国产 | 久久亚洲精品成人无码 | 无码一区二区三区在线 | 免费观看又污又黄的网站 | 国产精品久久久 | а√天堂www在线天堂小说 | 99视频精品全部免费免费观看 | 九月婷婷人人澡人人添人人爽 | 中文字幕无线码 | 国模大胆一区二区三区 | 精品少妇爆乳无码av无码专区 | 久久综合色之久久综合 | 丁香花在线影院观看在线播放 | 成 人 网 站国产免费观看 | 内射巨臀欧美在线视频 | 欧美成人高清在线播放 | 国产成人一区二区三区别 | 亚洲最大成人网站 | 强奷人妻日本中文字幕 | 又大又硬又爽免费视频 | 成人av无码一区二区三区 | 免费无码一区二区三区蜜桃大 | 精品人妻人人做人人爽夜夜爽 | 久青草影院在线观看国产 | 国产xxx69麻豆国语对白 | 日本大乳高潮视频在线观看 | 樱花草在线播放免费中文 | 国产两女互慰高潮视频在线观看 | 日本精品少妇一区二区三区 | 欧美日本免费一区二区三区 | 国产成人无码一二三区视频 | 久久久久久久女国产乱让韩 | 香港三级日本三级妇三级 | 伊人色综合久久天天小片 | 妺妺窝人体色www婷婷 | 国产成人精品视频ⅴa片软件竹菊 | 色综合视频一区二区三区 | 欧美老妇与禽交 | 日本一卡2卡3卡四卡精品网站 | 久久综合久久自在自线精品自 | 国产欧美精品一区二区三区 | 欧美激情综合亚洲一二区 | 精品熟女少妇av免费观看 | 国产精品人人妻人人爽 | 一本色道久久综合亚洲精品不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 色窝窝无码一区二区三区色欲 | 久久精品国产一区二区三区肥胖 | 99国产欧美久久久精品 | 国产特级毛片aaaaaaa高清 | 无码人妻黑人中文字幕 | 99久久精品午夜一区二区 | 少妇性俱乐部纵欲狂欢电影 | 欧美猛少妇色xxxxx | 人妻无码久久精品人妻 | 日韩av无码中文无码电影 | 熟女少妇在线视频播放 | 一区二区三区乱码在线 | 欧洲 | 国产精品亚洲一区二区三区喷水 | 久激情内射婷内射蜜桃人妖 | 日日摸日日碰夜夜爽av | 国产精品久久久av久久久 | 亚洲乱码日产精品bd | 极品尤物被啪到呻吟喷水 | 亚洲精品鲁一鲁一区二区三区 | 内射爽无广熟女亚洲 | 国产亚洲精品久久久闺蜜 | 无码av岛国片在线播放 | 久久国产精品二国产精品 | 亚洲精品久久久久久久久久久 | 高清国产亚洲精品自在久久 | 学生妹亚洲一区二区 | 内射巨臀欧美在线视频 | 亚洲天堂2017无码中文 | 99久久精品国产一区二区蜜芽 | 性欧美牲交在线视频 | 国产香蕉尹人视频在线 | 亚洲 另类 在线 欧美 制服 | 亚洲毛片av日韩av无码 | 日韩欧美群交p片內射中文 | 国产精品无码一区二区桃花视频 | 免费国产黄网站在线观看 | 天天爽夜夜爽夜夜爽 | 久久综合激激的五月天 | 亚洲色在线无码国产精品不卡 | 女人色极品影院 | 漂亮人妻洗澡被公强 日日躁 | 荫蒂被男人添的好舒服爽免费视频 | 老子影院午夜伦不卡 | 99久久人妻精品免费二区 | 国产人妻精品午夜福利免费 | 国产激情精品一区二区三区 | 真人与拘做受免费视频一 | 亚洲精品无码人妻无码 | 内射欧美老妇wbb | 亚洲 日韩 欧美 成人 在线观看 | 亚洲精品成人av在线 | 国产午夜亚洲精品不卡下载 | 国产真人无遮挡作爱免费视频 | 欧美黑人性暴力猛交喷水 | 国产精品第一区揄拍无码 | 中文精品久久久久人妻不卡 | 国产精品久久久久影院嫩草 | 久久99精品久久久久久动态图 | 国产性生交xxxxx无码 | 亚洲国产日韩a在线播放 | 亚洲国产成人a精品不卡在线 | 丰满人妻一区二区三区免费视频 | 国产精品高潮呻吟av久久4虎 | 最新版天堂资源中文官网 | 18禁止看的免费污网站 | 国产成人综合色在线观看网站 | 日本乱人伦片中文三区 | 无遮挡啪啪摇乳动态图 | 色老头在线一区二区三区 | 国产成人无码区免费内射一片色欲 | 精品国产一区av天美传媒 | 无码精品国产va在线观看dvd | 国内老熟妇对白xxxxhd | 久久精品女人天堂av免费观看 | 中国女人内谢69xxxxxa片 | 亚洲欧美日韩国产精品一区二区 | 日本xxxx色视频在线观看免费 | 欧美日韩在线亚洲综合国产人 | 国产精品va在线观看无码 | 人人妻人人澡人人爽人人精品浪潮 | 少妇人妻偷人精品无码视频 | 国产欧美亚洲精品a | 欧美日本精品一区二区三区 | 国产亚洲美女精品久久久2020 | 久久五月精品中文字幕 | 久久精品人人做人人综合试看 | 婷婷五月综合激情中文字幕 | 欧美日韩人成综合在线播放 | 天下第一社区视频www日本 | 狂野欧美性猛xxxx乱大交 | 国产精品va在线播放 | 九九久久精品国产免费看小说 | 又大又紧又粉嫩18p少妇 | 日韩在线不卡免费视频一区 | 丝袜足控一区二区三区 | 天堂а√在线中文在线 | aⅴ在线视频男人的天堂 | 性做久久久久久久免费看 | 久久久久久国产精品无码下载 | 精品人妻人人做人人爽夜夜爽 | 四虎国产精品免费久久 | 草草网站影院白丝内射 | 少妇的肉体aa片免费 | 麻豆国产丝袜白领秘书在线观看 | 欧美精品国产综合久久 | 欧美午夜特黄aaaaaa片 | 国产精品久免费的黄网站 | 国产一区二区三区精品视频 | 中文字幕日韩精品一区二区三区 | 中文字幕乱码亚洲无线三区 | 天天拍夜夜添久久精品 | 亚洲爆乳无码专区 | 久久久精品欧美一区二区免费 | 人妻天天爽夜夜爽一区二区 | 国产成人午夜福利在线播放 | 少妇被黑人到高潮喷出白浆 | 澳门永久av免费网站 | 久青草影院在线观看国产 | 国产精品.xx视频.xxtv | 国产人妻人伦精品 | 国产精品第一区揄拍无码 | 骚片av蜜桃精品一区 | 国产精品久免费的黄网站 | 中文字幕无码日韩欧毛 | 精品欧美一区二区三区久久久 | 国产精品理论片在线观看 | 特大黑人娇小亚洲女 | 东京热无码av男人的天堂 | 亚洲国产高清在线观看视频 | 超碰97人人做人人爱少妇 | 久久99国产综合精品 | 激情综合激情五月俺也去 | 国产av无码专区亚洲awww | 无码人妻精品一区二区三区不卡 | 300部国产真实乱 | 我要看www免费看插插视频 | 麻豆国产丝袜白领秘书在线观看 | 日韩欧美群交p片內射中文 | 国产婷婷色一区二区三区在线 | 久久久久久亚洲精品a片成人 | 久久午夜夜伦鲁鲁片无码免费 | 成人性做爰aaa片免费看 | 成熟人妻av无码专区 | 精品人妻av区 | 色欲综合久久中文字幕网 | 亚洲精品www久久久 | 在线天堂新版最新版在线8 | 色老头在线一区二区三区 | 人人妻人人藻人人爽欧美一区 | 人人妻人人澡人人爽欧美精品 | 国产免费久久久久久无码 | 一个人免费观看的www视频 | 久久国产精品萌白酱免费 | 精品夜夜澡人妻无码av蜜桃 | 欧美精品免费观看二区 | 久久精品一区二区三区四区 | 免费播放一区二区三区 | 97资源共享在线视频 | 青春草在线视频免费观看 | 久久久亚洲欧洲日产国码αv | 又紧又大又爽精品一区二区 | 亚洲午夜久久久影院 | 好男人www社区 | 丁香啪啪综合成人亚洲 | 黄网在线观看免费网站 | 夜先锋av资源网站 | 日本一本二本三区免费 | 丰满少妇弄高潮了www | 成熟妇人a片免费看网站 | 国产99久久精品一区二区 | 一个人免费观看的www视频 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕日韩精品一区二区三区 | 国产精品鲁鲁鲁 | 999久久久国产精品消防器材 | 国产成人综合在线女婷五月99播放 | 波多野结衣高清一区二区三区 | 亚洲欧美国产精品专区久久 | 久9re热视频这里只有精品 | 99精品久久毛片a片 | 天堂а√在线地址中文在线 | 377p欧洲日本亚洲大胆 | 国产精品手机免费 | 亚洲欧洲日本无在线码 | 国产午夜视频在线观看 | 中国女人内谢69xxxx | 激情五月综合色婷婷一区二区 | 欧美日本精品一区二区三区 | 无码午夜成人1000部免费视频 | 欧美freesex黑人又粗又大 | 天海翼激烈高潮到腰振不止 | 成人无码精品一区二区三区 | 成人毛片一区二区 | 乱人伦中文视频在线观看 | 熟女体下毛毛黑森林 | 色欲综合久久中文字幕网 | 成人亚洲精品久久久久软件 | 男女超爽视频免费播放 | 免费视频欧美无人区码 | 国产猛烈高潮尖叫视频免费 | 狠狠色欧美亚洲狠狠色www | 亚洲中文字幕久久无码 | 啦啦啦www在线观看免费视频 | 精品一区二区不卡无码av | 久久99久久99精品中文字幕 | 国产激情精品一区二区三区 | 岛国片人妻三上悠亚 | 久久国语露脸国产精品电影 | 一个人看的视频www在线 | 国产欧美精品一区二区三区 | 亚洲国产综合无码一区 | 性开放的女人aaa片 | 欧美丰满熟妇xxxx性ppx人交 | 国产乱人伦av在线无码 | 久久人妻内射无码一区三区 | 色婷婷综合中文久久一本 | 人妻中文无码久热丝袜 | 波多野结衣av一区二区全免费观看 | 婷婷六月久久综合丁香 | 中文精品无码中文字幕无码专区 | 特黄特色大片免费播放器图片 | 熟女少妇人妻中文字幕 | 性史性农村dvd毛片 | 无遮挡啪啪摇乳动态图 | 国产真实乱对白精彩久久 | 精品一区二区不卡无码av | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 熟女体下毛毛黑森林 | 在线亚洲高清揄拍自拍一品区 | 免费国产成人高清在线观看网站 | 国产精品a成v人在线播放 | 老熟妇乱子伦牲交视频 | 久久精品国产一区二区三区 | 亚洲国产精品一区二区第一页 | 久久久www成人免费毛片 | 男女下面进入的视频免费午夜 | 丁香啪啪综合成人亚洲 | 国产亲子乱弄免费视频 | 亚洲经典千人经典日产 | 亚洲一区av无码专区在线观看 | 丰满少妇熟乱xxxxx视频 | 麻花豆传媒剧国产免费mv在线 | 日欧一片内射va在线影院 | 国产特级毛片aaaaaaa高清 | 蜜桃臀无码内射一区二区三区 | 少妇无码一区二区二三区 | 国产成人无码午夜视频在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产在热线精品视频 | 伊人久久大香线焦av综合影院 | 久久久久亚洲精品男人的天堂 | 无码国产色欲xxxxx视频 | 国产成人精品久久亚洲高清不卡 | 成年美女黄网站色大免费全看 | 日本饥渴人妻欲求不满 | www国产精品内射老师 | 亚洲国产精品毛片av不卡在线 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 黑人玩弄人妻中文在线 | 久久亚洲精品成人无码 | 色窝窝无码一区二区三区色欲 | 亚洲一区二区三区 | 精品国精品国产自在久国产87 | 国产成人精品视频ⅴa片软件竹菊 | 精品一区二区三区波多野结衣 | 日韩欧美中文字幕公布 | 国产又粗又硬又大爽黄老大爷视 | 大乳丰满人妻中文字幕日本 | 亚洲 另类 在线 欧美 制服 | 欧美人与牲动交xxxx | 无套内射视频囯产 | 小sao货水好多真紧h无码视频 | 无码人妻av免费一区二区三区 | 亚洲高清偷拍一区二区三区 | 一区二区三区高清视频一 | 日本一卡二卡不卡视频查询 | 麻豆精品国产精华精华液好用吗 | 亚洲自偷自偷在线制服 | 亚洲精品久久久久中文第一幕 | 少妇性荡欲午夜性开放视频剧场 | 中国女人内谢69xxxxxa片 | 粗大的内捧猛烈进出视频 | 久久国语露脸国产精品电影 | 成人免费视频在线观看 | 久久精品成人欧美大片 | 久久久www成人免费毛片 | 久久国产劲爆∧v内射 | 精品国产一区二区三区四区 | 亚洲 激情 小说 另类 欧美 | 在线欧美精品一区二区三区 | 欧美性生交xxxxx久久久 | 久久国产精品_国产精品 | 久久亚洲国产成人精品性色 | 丰满诱人的人妻3 | 久青草影院在线观看国产 | 日日噜噜噜噜夜夜爽亚洲精品 | 少妇无码av无码专区在线观看 | 精品午夜福利在线观看 | 欧美日韩综合一区二区三区 | 无码人中文字幕 | 伊人久久大香线焦av综合影院 | 久久人人爽人人爽人人片av高清 | 亚洲国产精品美女久久久久 | 国产农村妇女高潮大叫 | 日本精品人妻无码免费大全 | 2019午夜福利不卡片在线 | √天堂资源地址中文在线 | 国产成人无码av片在线观看不卡 | 人妻尝试又大又粗久久 | 九月婷婷人人澡人人添人人爽 | 色窝窝无码一区二区三区色欲 | 日日天干夜夜狠狠爱 | 亚洲最大成人网站 | 人妻中文无码久热丝袜 | 亚洲综合无码久久精品综合 | 狠狠躁日日躁夜夜躁2020 | 欧美国产日韩亚洲中文 | 老熟妇乱子伦牲交视频 | 成人性做爰aaa片免费看不忠 | 亚洲精品久久久久avwww潮水 | 国产福利视频一区二区 | 成人一区二区免费视频 | 最新国产乱人伦偷精品免费网站 | 成人三级无码视频在线观看 | 久久综合久久自在自线精品自 | 欧美国产日韩久久mv | 国产成人精品视频ⅴa片软件竹菊 | 熟女少妇在线视频播放 | 67194成是人免费无码 | 国产猛烈高潮尖叫视频免费 | 在线观看免费人成视频 | 夜夜躁日日躁狠狠久久av | 国产亚洲美女精品久久久2020 | 亚洲精品一区二区三区四区五区 | 两性色午夜免费视频 | 男女性色大片免费网站 | 日韩精品乱码av一区二区 | 国产麻豆精品精东影业av网站 | 中文字幕人妻无码一区二区三区 | 性开放的女人aaa片 | 精品人妻人人做人人爽夜夜爽 | 亚洲成a人片在线观看无码 | 无码精品国产va在线观看dvd | 丰满人妻精品国产99aⅴ | 女高中生第一次破苞av | 偷窥日本少妇撒尿chinese | 久久综合给合久久狠狠狠97色 | 在线 国产 欧美 亚洲 天堂 | 亲嘴扒胸摸屁股激烈网站 | 亚洲色无码一区二区三区 | 国产精品久免费的黄网站 | √8天堂资源地址中文在线 | 国产精品igao视频网 | 精品国产乱码久久久久乱码 | 亚洲中文字幕va福利 | 国产亚洲精品久久久久久国模美 | 狠狠色噜噜狠狠狠7777奇米 | 波多野结衣av一区二区全免费观看 | 亚洲精品国产精品乱码视色 | 亚洲欧美日韩成人高清在线一区 | 精品国偷自产在线视频 | 国产午夜无码视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 白嫩日本少妇做爰 | 日韩亚洲欧美中文高清在线 | 国产97人人超碰caoprom | 人妻互换免费中文字幕 | 亚洲午夜无码久久 | 亚洲日韩一区二区 | aⅴ亚洲 日韩 色 图网站 播放 | 精品国产一区二区三区四区在线看 | 黑人大群体交免费视频 | 97资源共享在线视频 | 毛片内射-百度 | 久久久久99精品成人片 | 中文精品无码中文字幕无码专区 | 国产精品a成v人在线播放 | 亚洲国产精品美女久久久久 | 麻豆av传媒蜜桃天美传媒 | 久久久久久亚洲精品a片成人 | 日产精品高潮呻吟av久久 | 亚洲精品中文字幕乱码 | 国产又爽又黄又刺激的视频 | 国产成人无码a区在线观看视频app | 未满成年国产在线观看 | 大乳丰满人妻中文字幕日本 | 日日鲁鲁鲁夜夜爽爽狠狠 | 伊在人天堂亚洲香蕉精品区 | 无套内谢老熟女 | 牲欲强的熟妇农村老妇女 | 中国女人内谢69xxxxxa片 | 亚洲色成人中文字幕网站 | 日本丰满护士爆乳xxxx | 人人爽人人爽人人片av亚洲 | www成人国产高清内射 | 国产乡下妇女做爰 | 国内精品久久毛片一区二区 | 性欧美牲交xxxxx视频 | 十八禁真人啪啪免费网站 | 免费观看又污又黄的网站 | 国产亚洲人成在线播放 | 国产福利视频一区二区 | 欧洲精品码一区二区三区免费看 | 99精品国产综合久久久久五月天 | 大肉大捧一进一出视频出来呀 | 久精品国产欧美亚洲色aⅴ大片 | 欧美黑人巨大xxxxx | 性欧美videos高清精品 | 又粗又大又硬又长又爽 | 宝宝好涨水快流出来免费视频 | 中文字幕无码人妻少妇免费 | 亚洲爆乳大丰满无码专区 | 乱码午夜-极国产极内射 | 国产精品久久久久无码av色戒 | 最近中文2019字幕第二页 | 国产精品久久久久久久9999 | 在线播放无码字幕亚洲 | 国语自产偷拍精品视频偷 | 又大又紧又粉嫩18p少妇 | 午夜福利不卡在线视频 | 成人欧美一区二区三区 | 少妇性俱乐部纵欲狂欢电影 | 女人和拘做爰正片视频 | 成人片黄网站色大片免费观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 无码播放一区二区三区 | 国产午夜无码精品免费看 | 人人妻人人澡人人爽欧美一区 | 无码午夜成人1000部免费视频 | 兔费看少妇性l交大片免费 | 精品欧洲av无码一区二区三区 | 国产精品久久国产精品99 | 少妇性俱乐部纵欲狂欢电影 | 日韩av无码中文无码电影 | 中文亚洲成a人片在线观看 | 亚洲日韩av一区二区三区四区 | 色诱久久久久综合网ywww | 97人妻精品一区二区三区 | 永久免费观看美女裸体的网站 | 一二三四在线观看免费视频 | 一本大道久久东京热无码av | 亚洲国产精品无码久久久久高潮 | 精品乱子伦一区二区三区 | 无遮挡啪啪摇乳动态图 | 大色综合色综合网站 | 国产在线精品一区二区三区直播 | 久久无码中文字幕免费影院蜜桃 | 99国产精品白浆在线观看免费 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 夜夜高潮次次欢爽av女 | 欧美高清在线精品一区 | 沈阳熟女露脸对白视频 | √天堂中文官网8在线 | 中文字幕av无码一区二区三区电影 | 色综合久久中文娱乐网 | 国色天香社区在线视频 | 午夜无码人妻av大片色欲 | 国内少妇偷人精品视频 | 亚洲熟妇自偷自拍另类 | 亚洲综合另类小说色区 | 国产精品资源一区二区 | 中文字幕无码免费久久9一区9 | 久久久中文久久久无码 | 亚洲七七久久桃花影院 | 中文字幕av日韩精品一区二区 | 亚洲欧美日韩国产精品一区二区 | 欧美阿v高清资源不卡在线播放 | 国产精品无码一区二区桃花视频 | 久久综合给合久久狠狠狠97色 | 国产人妻精品午夜福利免费 | 国产农村乱对白刺激视频 | 久久无码专区国产精品s | 俺去俺来也在线www色官网 | 亚洲午夜久久久影院 | 曰韩无码二三区中文字幕 | 性生交大片免费看l | 久久久久99精品成人片 | 国产色xx群视频射精 | 大地资源网第二页免费观看 | 久久午夜夜伦鲁鲁片无码免费 | 曰韩少妇内射免费播放 | 精品无码国产一区二区三区av | 麻豆人妻少妇精品无码专区 | 国产精品无码一区二区桃花视频 | 无码精品人妻一区二区三区av | aa片在线观看视频在线播放 | 亚洲春色在线视频 | 日日麻批免费40分钟无码 | 亚洲人成网站色7799 | 97人妻精品一区二区三区 | 亚洲а∨天堂久久精品2021 | av无码不卡在线观看免费 | 亚洲欧美中文字幕5发布 | 丰满岳乱妇在线观看中字无码 | 免费播放一区二区三区 | 国产亚洲tv在线观看 | 日韩av无码一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 在线播放无码字幕亚洲 | 台湾无码一区二区 | 天天摸天天透天天添 | 亚洲中文字幕无码中文字在线 | 国产尤物精品视频 | 日日干夜夜干 | 天堂无码人妻精品一区二区三区 | 永久免费观看美女裸体的网站 | 色婷婷香蕉在线一区二区 | 国产97在线 | 亚洲 | 97无码免费人妻超级碰碰夜夜 | 国产精品久久久午夜夜伦鲁鲁 | 在线精品亚洲一区二区 | 一二三四在线观看免费视频 | 97精品人妻一区二区三区香蕉 | 久久精品丝袜高跟鞋 | 国产激情无码一区二区 | 午夜理论片yy44880影院 | 亚洲日本va午夜在线电影 | 久久99精品久久久久婷婷 | 2019nv天堂香蕉在线观看 | 四虎国产精品免费久久 | 国产高清av在线播放 | 精品国产一区二区三区四区 | 亚洲精品欧美二区三区中文字幕 | 久久精品人妻少妇一区二区三区 | 麻豆国产人妻欲求不满谁演的 | 亚洲va中文字幕无码久久不卡 | 国产激情无码一区二区app | 亚洲狠狠婷婷综合久久 | 日韩欧美中文字幕公布 | 亚洲日本在线电影 | 国产亚洲精品久久久久久国模美 | 无码国产激情在线观看 | 99麻豆久久久国产精品免费 | 精品午夜福利在线观看 | 中文久久乱码一区二区 | 欧美精品无码一区二区三区 | 永久黄网站色视频免费直播 | 日韩欧美中文字幕在线三区 | 欧美国产日产一区二区 | 欧美xxxxx精品 | 欧美丰满老熟妇xxxxx性 | 国产精品久久久av久久久 | 99精品国产综合久久久久五月天 | 暴力强奷在线播放无码 | av无码久久久久不卡免费网站 | 精品国偷自产在线视频 | 精品无人国产偷自产在线 | 色 综合 欧美 亚洲 国产 | 国产精品高潮呻吟av久久4虎 | 少妇人妻大乳在线视频 | 无码毛片视频一区二区本码 | 97夜夜澡人人双人人人喊 | 欧美 丝袜 自拍 制服 另类 | 欧美肥老太牲交大战 | 兔费看少妇性l交大片免费 | 兔费看少妇性l交大片免费 | 成人亚洲精品久久久久软件 | 精品少妇爆乳无码av无码专区 | 欧美怡红院免费全部视频 | 成人亚洲精品久久久久软件 | 久久久久av无码免费网 | 老熟妇乱子伦牲交视频 | 亚洲色偷偷偷综合网 | 欧美午夜特黄aaaaaa片 | 亚欧洲精品在线视频免费观看 | 一本久道久久综合狠狠爱 | 日产国产精品亚洲系列 | 丰满少妇女裸体bbw | 亚洲精品久久久久久一区二区 | 国内揄拍国内精品少妇国语 | 熟妇人妻中文av无码 | 欧美精品免费观看二区 | 精品国产福利一区二区 | 亚洲午夜久久久影院 | 亚洲爆乳精品无码一区二区三区 | 狠狠cao日日穞夜夜穞av | 亚洲成在人网站无码天堂 | 少妇无套内谢久久久久 | 国产精品无码mv在线观看 | 无码毛片视频一区二区本码 | 成人无码影片精品久久久 | 日本大香伊一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 少妇高潮喷潮久久久影院 | 荫蒂被男人添的好舒服爽免费视频 | 中国大陆精品视频xxxx | 扒开双腿疯狂进出爽爽爽视频 | 日本又色又爽又黄的a片18禁 | 日本丰满护士爆乳xxxx | 精品国产成人一区二区三区 | 乱人伦中文视频在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲日本在线电影 | 丁香花在线影院观看在线播放 | 久久熟妇人妻午夜寂寞影院 | 老子影院午夜精品无码 | 性色av无码免费一区二区三区 | 强奷人妻日本中文字幕 | 久久综合九色综合欧美狠狠 | 国产成人一区二区三区在线观看 | 亚洲熟妇色xxxxx亚洲 | 少妇人妻av毛片在线看 | 中文字幕无码人妻少妇免费 | 精品久久久无码中文字幕 | 亚洲日韩av片在线观看 | 精品国产一区二区三区四区 | 丰满少妇熟乱xxxxx视频 | 女人色极品影院 | 捆绑白丝粉色jk震动捧喷白浆 | 正在播放老肥熟妇露脸 | 欧美变态另类xxxx | 97久久精品无码一区二区 | 久久久久99精品国产片 | 免费无码午夜福利片69 | 亚洲一区二区三区四区 | 大乳丰满人妻中文字幕日本 | 亚拍精品一区二区三区探花 | 亚洲呦女专区 | 少妇人妻大乳在线视频 | 久久精品国产大片免费观看 | 97精品人妻一区二区三区香蕉 | 日本成熟视频免费视频 | 国产精品手机免费 | 亚洲日韩av片在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 色一情一乱一伦 | 天天拍夜夜添久久精品 | 牲欲强的熟妇农村老妇女视频 | 成 人 网 站国产免费观看 | 国产激情艳情在线看视频 | 亚洲国产精品无码久久久久高潮 | 中文字幕av无码一区二区三区电影 | 久久久久久九九精品久 | 精品国产精品久久一区免费式 | 亚洲欧美精品伊人久久 | 日本xxxx色视频在线观看免费 | 日韩精品无码一区二区中文字幕 | v一区无码内射国产 | 97精品人妻一区二区三区香蕉 | 国产香蕉尹人视频在线 | 99久久人妻精品免费一区 | 2019nv天堂香蕉在线观看 | 精品成在人线av无码免费看 | 99久久99久久免费精品蜜桃 | yw尤物av无码国产在线观看 | 日韩精品无码一本二本三本色 | 麻豆人妻少妇精品无码专区 | 亚洲中文字幕无码中文字在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久久久av无码免费看大片 | 国产成人无码a区在线观看视频app | 一本一道久久综合久久 | 夫妻免费无码v看片 | 国产偷国产偷精品高清尤物 | 午夜丰满少妇性开放视频 | 波多野42部无码喷潮在线 | www国产精品内射老师 | av无码不卡在线观看免费 | 成人无码精品1区2区3区免费看 | 国产两女互慰高潮视频在线观看 | 国产suv精品一区二区五 | 欧美性生交xxxxx久久久 | 国产精品理论片在线观看 | 日本va欧美va欧美va精品 | 精品人妻人人做人人爽 | 久久99热只有频精品8 | 精品成在人线av无码免费看 | 国产sm调教视频在线观看 | 在线观看欧美一区二区三区 | 2019nv天堂香蕉在线观看 | 性生交大片免费看女人按摩摩 | 成人亚洲精品久久久久 | 色一情一乱一伦一区二区三欧美 | 曰韩无码二三区中文字幕 | 国产精品福利视频导航 | 亚洲成av人综合在线观看 | 精品水蜜桃久久久久久久 | 女人被男人躁得好爽免费视频 | 中文字幕乱码人妻无码久久 | 日韩少妇白浆无码系列 | 色一情一乱一伦一视频免费看 | 亚无码乱人伦一区二区 | 日本大香伊一区二区三区 | 熟女俱乐部五十路六十路av | 国产乱人无码伦av在线a | 亚洲娇小与黑人巨大交 | 免费看男女做好爽好硬视频 | 国产真实伦对白全集 | 人妻少妇精品久久 | 熟女俱乐部五十路六十路av | 国产偷国产偷精品高清尤物 | 亚洲午夜久久久影院 | 亚洲国产欧美日韩精品一区二区三区 | 久久久久久九九精品久 | 久久精品国产日本波多野结衣 | 国产人妻人伦精品1国产丝袜 | 精品国产一区av天美传媒 | 99er热精品视频 | 亚洲娇小与黑人巨大交 | 色诱久久久久综合网ywww | av小次郎收藏 | 伊人久久大香线蕉午夜 | 国产亚洲人成在线播放 | 成人av无码一区二区三区 | 无码人中文字幕 | 精品国产一区av天美传媒 | 午夜精品一区二区三区的区别 | 老子影院午夜精品无码 | 久久久久久久久蜜桃 | 国产网红无码精品视频 | 国内丰满熟女出轨videos | 粗大的内捧猛烈进出视频 | 熟妇激情内射com | 久久精品国产99精品亚洲 | 少妇被粗大的猛进出69影院 | 中文无码成人免费视频在线观看 | 18禁黄网站男男禁片免费观看 | 一本大道伊人av久久综合 | 国产精品美女久久久网av | 欧美国产日韩亚洲中文 | 亚洲日韩中文字幕在线播放 | 在线视频网站www色 | 国产精品亚洲综合色区韩国 | 午夜免费福利小电影 | 纯爱无遮挡h肉动漫在线播放 | 夫妻免费无码v看片 | 一本加勒比波多野结衣 | 日日橹狠狠爱欧美视频 | 久久午夜无码鲁丝片秋霞 | 无码吃奶揉捏奶头高潮视频 | 永久免费精品精品永久-夜色 | 国产人妻大战黑人第1集 | 99国产精品白浆在线观看免费 | 欧美激情综合亚洲一二区 | 国产口爆吞精在线视频 | 国产午夜无码精品免费看 | 少妇久久久久久人妻无码 | 国产内射爽爽大片视频社区在线 | 午夜精品一区二区三区的区别 | 中文字幕乱妇无码av在线 | 亚洲成av人片在线观看无码不卡 | 亚洲小说图区综合在线 | 久久亚洲中文字幕精品一区 | 精品厕所偷拍各类美女tp嘘嘘 | 在线观看国产午夜福利片 | av无码不卡在线观看免费 | 亚洲熟妇色xxxxx欧美老妇 | 最新国产乱人伦偷精品免费网站 | 欧洲vodafone精品性 | 成人性做爰aaa片免费看 | 亚洲一区二区三区四区 | 草草网站影院白丝内射 | 国产成人无码av片在线观看不卡 | 欧美精品无码一区二区三区 | 国产亲子乱弄免费视频 | 理论片87福利理论电影 | 午夜精品久久久久久久久 | 欧美成人高清在线播放 | 国产精品igao视频网 | 成人动漫在线观看 | 亚洲国产精品无码久久久久高潮 | 国产激情艳情在线看视频 | 国语自产偷拍精品视频偷 | 欧洲vodafone精品性 | 国产人妻精品一区二区三区不卡 | 久久久久久久久蜜桃 | 日韩欧美群交p片內射中文 | 久久综合给合久久狠狠狠97色 | 日韩欧美成人免费观看 | 亚洲国产日韩a在线播放 | 久久精品视频在线看15 | 正在播放东北夫妻内射 | 樱花草在线社区www | 强伦人妻一区二区三区视频18 | 无码人妻少妇伦在线电影 | 中文字幕无码热在线视频 | 无码av中文字幕免费放 | 5858s亚洲色大成网站www | 国产亚洲精品精品国产亚洲综合 | 天天拍夜夜添久久精品大 | 波多野结衣av一区二区全免费观看 | 日本va欧美va欧美va精品 | 亚洲中文字幕久久无码 | 成人亚洲精品久久久久 | 国产深夜福利视频在线 | 国精产品一品二品国精品69xx | 国产国产精品人在线视 | 亚洲狠狠婷婷综合久久 | 国产无套内射久久久国产 | 亚洲成av人在线观看网址 | 88国产精品欧美一区二区三区 | 国产午夜无码视频在线观看 | 激情五月综合色婷婷一区二区 | 日日碰狠狠躁久久躁蜜桃 | 日韩人妻少妇一区二区三区 | 18禁黄网站男男禁片免费观看 | 无遮无挡爽爽免费视频 | 国产艳妇av在线观看果冻传媒 | 欧美一区二区三区视频在线观看 | 亚洲色成人中文字幕网站 | 国色天香社区在线视频 | 成在人线av无码免观看麻豆 | 久久视频在线观看精品 | 亚洲午夜无码久久 | 色一情一乱一伦 | 97色伦图片97综合影院 | 99久久久国产精品无码免费 | 麻豆人妻少妇精品无码专区 | 巨爆乳无码视频在线观看 | 国产农村妇女高潮大叫 | 狠狠色噜噜狠狠狠7777奇米 | 国产两女互慰高潮视频在线观看 | 午夜福利一区二区三区在线观看 | 色婷婷香蕉在线一区二区 | 精品国产国产综合精品 | 日韩av激情在线观看 | 久久99精品久久久久久动态图 | 天天爽夜夜爽夜夜爽 | 人妻天天爽夜夜爽一区二区 | 亚洲gv猛男gv无码男同 | 波多野结衣高清一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 国产乱人偷精品人妻a片 | 一本久道久久综合狠狠爱 | 国产av一区二区精品久久凹凸 | 国产福利视频一区二区 | 欧美国产日韩久久mv | 国产人妻久久精品二区三区老狼 | 鲁鲁鲁爽爽爽在线视频观看 | 欧美乱妇无乱码大黄a片 | 在线观看免费人成视频 | 内射老妇bbwx0c0ck | 中文字幕中文有码在线 | 狠狠噜狠狠狠狠丁香五月 | 中文字幕无码日韩专区 | 青春草在线视频免费观看 | 无码人妻出轨黑人中文字幕 | 久久精品国产精品国产精品污 | 精品国产一区av天美传媒 | 日韩精品无码一本二本三本色 | 人人妻人人澡人人爽欧美一区九九 | 国产成人综合美国十次 | 欧洲美熟女乱又伦 | 亚洲国产一区二区三区在线观看 | 亚洲s码欧洲m码国产av | 亚洲日韩精品欧美一区二区 | 中文亚洲成a人片在线观看 | 国产超碰人人爽人人做人人添 | 男人扒开女人内裤强吻桶进去 | 欧美精品在线观看 | 亚洲国产午夜精品理论片 | 欧美精品无码一区二区三区 | 波多野结衣av在线观看 | 又大又紧又粉嫩18p少妇 | 久久综合九色综合欧美狠狠 | 精品国偷自产在线视频 | 亚洲色欲色欲欲www在线 | 377p欧洲日本亚洲大胆 | 三上悠亚人妻中文字幕在线 | 国产超级va在线观看视频 | 久久久亚洲欧洲日产国码αv | 亚洲毛片av日韩av无码 | 女人被男人躁得好爽免费视频 | 日日天干夜夜狠狠爱 | 亚洲精品久久久久久一区二区 | 97夜夜澡人人爽人人喊中国片 | 人人澡人人妻人人爽人人蜜桃 | 日韩无码专区 | 中文字幕乱码亚洲无线三区 | 日韩精品无码一区二区中文字幕 | 亚洲成a人一区二区三区 | 初尝人妻少妇中文字幕 | 国产97色在线 | 免 | 亚洲欧美日韩国产精品一区二区 | 午夜熟女插插xx免费视频 | 色欲人妻aaaaaaa无码 | 激情内射亚州一区二区三区爱妻 | 日韩无码专区 | 国产精品无码一区二区三区不卡 | 免费看男女做好爽好硬视频 | 精品乱子伦一区二区三区 | 国产黄在线观看免费观看不卡 | 午夜免费福利小电影 | 自拍偷自拍亚洲精品被多人伦好爽 | 学生妹亚洲一区二区 | 精品厕所偷拍各类美女tp嘘嘘 | 在线欧美精品一区二区三区 | 精品久久综合1区2区3区激情 | 亚洲精品无码人妻无码 | 国产香蕉尹人视频在线 | 蜜桃视频韩日免费播放 | 国产综合在线观看 | 永久免费精品精品永久-夜色 | 欧美自拍另类欧美综合图片区 | 中文字幕+乱码+中文字幕一区 | 中文无码成人免费视频在线观看 | 国产疯狂伦交大片 | 精品国偷自产在线视频 | 亚洲中文字幕无码中字 | 亚洲欧美日韩成人高清在线一区 | 爽爽影院免费观看 | 久久综合九色综合欧美狠狠 | 午夜嘿嘿嘿影院 | 国产精品成人av在线观看 | 久久99精品国产麻豆 | 国产人妻大战黑人第1集 | 岛国片人妻三上悠亚 | 亚洲另类伦春色综合小说 | 日本一卡二卡不卡视频查询 | 99久久人妻精品免费二区 | 国产无遮挡又黄又爽又色 | 国产成人人人97超碰超爽8 | 国精品人妻无码一区二区三区蜜柚 | 国产精品美女久久久久av爽李琼 | 亚洲熟妇色xxxxx欧美老妇y | 国产精品无套呻吟在线 | 性史性农村dvd毛片 | 日本在线高清不卡免费播放 | 九九在线中文字幕无码 | 国产九九九九九九九a片 | 国产精品内射视频免费 | 精品国产福利一区二区 | 十八禁真人啪啪免费网站 | 欧美 日韩 亚洲 在线 | 国产乱人伦偷精品视频 | 欧美高清在线精品一区 | 无码人妻丰满熟妇区五十路百度 | 日本精品久久久久中文字幕 | 日韩精品一区二区av在线 | 天天综合网天天综合色 | 小泽玛莉亚一区二区视频在线 | 特黄特色大片免费播放器图片 | 成熟女人特级毛片www免费 | 国产乱人偷精品人妻a片 | 又大又紧又粉嫩18p少妇 | 成人精品天堂一区二区三区 | 欧美性猛交xxxx富婆 | 亚洲午夜无码久久 | 国产激情一区二区三区 | 日本大乳高潮视频在线观看 | 1000部啪啪未满十八勿入下载 | 中文字幕日产无线码一区 | 丰满人妻精品国产99aⅴ | 国产一区二区不卡老阿姨 | 精品国产麻豆免费人成网站 | 国产一区二区三区四区五区加勒比 | 日日天日日夜日日摸 | 5858s亚洲色大成网站www | 亚洲精品国偷拍自产在线麻豆 | 国产精品亚洲五月天高清 | 少妇邻居内射在线 | 久久99精品久久久久久动态图 | 精品夜夜澡人妻无码av蜜桃 | 成人三级无码视频在线观看 | 老子影院午夜伦不卡 | 老熟女重囗味hdxx69 | 纯爱无遮挡h肉动漫在线播放 | 欧美丰满老熟妇xxxxx性 | 特大黑人娇小亚洲女 | 欧美性生交活xxxxxdddd | 亚欧洲精品在线视频免费观看 | 亚洲欧美日韩国产精品一区二区 | 久久久av男人的天堂 | a在线观看免费网站大全 | 兔费看少妇性l交大片免费 | 无码av最新清无码专区吞精 | 亚洲中文字幕在线无码一区二区 | 麻豆国产人妻欲求不满谁演的 | 国内精品久久毛片一区二区 | 高潮毛片无遮挡高清免费 | 久久久久久国产精品无码下载 | 久久综合九色综合欧美狠狠 | 水蜜桃亚洲一二三四在线 | 免费中文字幕日韩欧美 | 日日躁夜夜躁狠狠躁 | 国产九九九九九九九a片 | 老司机亚洲精品影院无码 | 亚洲成色www久久网站 | 免费无码午夜福利片69 | 国产口爆吞精在线视频 | 亚洲爆乳无码专区 | 日本一卡二卡不卡视频查询 | 国产美女极度色诱视频www | 国产av剧情md精品麻豆 | 无码av中文字幕免费放 | 高潮毛片无遮挡高清免费 | 色综合天天综合狠狠爱 | 日韩亚洲欧美中文高清在线 | 久久久久久久人妻无码中文字幕爆 | 未满小14洗澡无码视频网站 | 精品无码一区二区三区的天堂 | 亚洲综合精品香蕉久久网 | 中文字幕日韩精品一区二区三区 | 欧美老熟妇乱xxxxx | 久久精品中文闷骚内射 | 300部国产真实乱 | 日本高清一区免费中文视频 | 特黄特色大片免费播放器图片 | 亚洲天堂2017无码 | 免费观看又污又黄的网站 | 亚洲爆乳大丰满无码专区 | 亚洲毛片av日韩av无码 | 国产两女互慰高潮视频在线观看 | 亚洲国产成人av在线观看 | 亚洲国产精品一区二区第一页 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲 欧美 激情 小说 另类 | 国产精品久久久久久久9999 | 欧美丰满老熟妇xxxxx性 | 天堂无码人妻精品一区二区三区 | 特黄特色大片免费播放器图片 | 成人性做爰aaa片免费看 | 国产精品人妻一区二区三区四 | 久久国产自偷自偷免费一区调 | 一区二区传媒有限公司 | 国产无遮挡又黄又爽又色 | 免费国产黄网站在线观看 | 亚洲国产精品一区二区第一页 | 无码av最新清无码专区吞精 | 97久久精品无码一区二区 | 99久久99久久免费精品蜜桃 | 中文无码成人免费视频在线观看 | 中文精品久久久久人妻不卡 | 中文无码伦av中文字幕 | 亚洲成a人片在线观看无码3d | 国产疯狂伦交大片 | 日本又色又爽又黄的a片18禁 | 精品一二三区久久aaa片 | 日韩av无码一区二区三区不卡 | 内射老妇bbwx0c0ck | 日韩精品乱码av一区二区 | 久久精品国产99精品亚洲 | 日韩精品乱码av一区二区 | 精品一区二区三区无码免费视频 | 99久久无码一区人妻 | 性欧美牲交在线视频 | 98国产精品综合一区二区三区 | 粉嫩少妇内射浓精videos | 在线观看国产一区二区三区 | 国产熟妇另类久久久久 | 国内精品一区二区三区不卡 | 国产av剧情md精品麻豆 | 中文字幕无码日韩欧毛 | 性欧美大战久久久久久久 | 天天做天天爱天天爽综合网 | 亚洲爆乳大丰满无码专区 | 亚洲经典千人经典日产 | 国产成人综合在线女婷五月99播放 | 国产农村妇女高潮大叫 | 日日橹狠狠爱欧美视频 | 国产香蕉97碰碰久久人人 | 粗大的内捧猛烈进出视频 | 四虎影视成人永久免费观看视频 | 少妇无套内谢久久久久 | a片免费视频在线观看 | 少妇人妻大乳在线视频 | 亚洲经典千人经典日产 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产av一区二区三区最新精品 | 丝袜美腿亚洲一区二区 | 国产麻豆精品一区二区三区v视界 | 国产av无码专区亚洲a∨毛片 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产美女极度色诱视频www | 欧美35页视频在线观看 | 性色欲网站人妻丰满中文久久不卡 | 18禁止看的免费污网站 | 亚洲精品无码人妻无码 | 精品国产一区二区三区av 性色 | 无人区乱码一区二区三区 | 国产精品免费大片 | aⅴ亚洲 日韩 色 图网站 播放 | 国内精品人妻无码久久久影院蜜桃 | 亚洲爆乳精品无码一区二区三区 | 欧美日韩亚洲国产精品 | 国产艳妇av在线观看果冻传媒 | 亚洲天堂2017无码中文 | 西西人体www44rt大胆高清 | 亚洲精品国产品国语在线观看 | 牲欲强的熟妇农村老妇女 | 国产又爽又黄又刺激的视频 | 中文字幕乱码中文乱码51精品 | 日产国产精品亚洲系列 | 人人妻人人澡人人爽欧美精品 | 日韩欧美群交p片內射中文 | 欧美成人高清在线播放 | 日本一卡2卡3卡四卡精品网站 | 女人被男人爽到呻吟的视频 | 麻豆国产丝袜白领秘书在线观看 | 99久久久无码国产精品免费 | 久久午夜无码鲁丝片午夜精品 | 日韩人妻少妇一区二区三区 | 日本一区二区三区免费高清 | 国产精品亚洲а∨无码播放麻豆 | 国产精品久久福利网站 | 亚洲男女内射在线播放 | 初尝人妻少妇中文字幕 | 国产真人无遮挡作爱免费视频 | 国产无av码在线观看 | 爽爽影院免费观看 | 在线天堂新版最新版在线8 | аⅴ资源天堂资源库在线 | 99久久99久久免费精品蜜桃 | 亚洲综合无码久久精品综合 | 亚洲爆乳无码专区 | 国产精品对白交换视频 | 99久久久国产精品无码免费 | 久久久精品人妻久久影视 | 亚洲第一网站男人都懂 | 欧美日韩一区二区三区自拍 | 欧美人与善在线com | 精品久久久久香蕉网 | 成人无码精品一区二区三区 | 我要看www免费看插插视频 | 欧美喷潮久久久xxxxx | 欧美激情一区二区三区成人 | 亚洲自偷自拍另类第1页 | 欧美亚洲国产一区二区三区 | 一本色道久久综合狠狠躁 | 久久亚洲日韩精品一区二区三区 | 色一情一乱一伦一区二区三欧美 | 性史性农村dvd毛片 | 亚洲天堂2017无码中文 | 亚洲国产欧美国产综合一区 | 粉嫩少妇内射浓精videos | 国产激情精品一区二区三区 | 激情内射日本一区二区三区 | 久久午夜无码鲁丝片 | 国产超碰人人爽人人做人人添 | 精品久久久久久人妻无码中文字幕 | 色综合天天综合狠狠爱 | 俄罗斯老熟妇色xxxx | 亚洲码国产精品高潮在线 | 高潮毛片无遮挡高清免费 | 无码一区二区三区在线 | 日韩人妻少妇一区二区三区 | 国产办公室秘书无码精品99 | 亚洲乱码日产精品bd | 国产熟女一区二区三区四区五区 | 国产三级精品三级男人的天堂 | 未满成年国产在线观看 | 少妇人妻av毛片在线看 | 日本免费一区二区三区最新 | 久久亚洲日韩精品一区二区三区 | 在线播放免费人成毛片乱码 | 鲁鲁鲁爽爽爽在线视频观看 | 少妇无码一区二区二三区 | 亚洲中文字幕无码中文字在线 | 亚洲呦女专区 | 国产精品国产三级国产专播 | 国产激情一区二区三区 | 久久精品中文字幕一区 | 无码人妻少妇伦在线电影 | 国产又粗又硬又大爽黄老大爷视 | 在线观看欧美一区二区三区 | 久久99国产综合精品 | 99er热精品视频 | 一本久久伊人热热精品中文字幕 | 国产色xx群视频射精 | 国产精品鲁鲁鲁 | 亚洲精品鲁一鲁一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 高清国产亚洲精品自在久久 | 国产明星裸体无码xxxx视频 | 一本久久伊人热热精品中文字幕 | 亚洲精品国产精品乱码不卡 | a在线亚洲男人的天堂 | 国产精品无码一区二区桃花视频 | 一个人看的www免费视频在线观看 | 性欧美大战久久久久久久 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产午夜无码精品免费看 | 日本成熟视频免费视频 | 老熟妇仑乱视频一区二区 | 日本欧美一区二区三区乱码 | 国产猛烈高潮尖叫视频免费 | 无套内谢老熟女 | 澳门永久av免费网站 | 国产亚洲精品久久久久久大师 | 中文字幕中文有码在线 | 无码国产乱人伦偷精品视频 | 在线a亚洲视频播放在线观看 | 久久久www成人免费毛片 | 天天躁夜夜躁狠狠是什么心态 | 999久久久国产精品消防器材 | 九一九色国产 | 亚洲呦女专区 | 少妇人妻偷人精品无码视频 | 老头边吃奶边弄进去呻吟 | 无码国产激情在线观看 | 久久久久久国产精品无码下载 | 男人的天堂2018无码 | 麻豆国产97在线 | 欧洲 | 东京无码熟妇人妻av在线网址 | 伊人久久大香线焦av综合影院 | 99久久婷婷国产综合精品青草免费 | 中文字幕av伊人av无码av | 日日摸日日碰夜夜爽av | 在线观看欧美一区二区三区 | 亚洲欧美国产精品专区久久 | 欧美丰满熟妇xxxx性ppx人交 | 精品国产精品久久一区免费式 | 日韩亚洲欧美精品综合 | 少女韩国电视剧在线观看完整 | а√天堂www在线天堂小说 | 亚洲中文字幕无码中字 | 亚洲熟悉妇女xxx妇女av | 亚洲日本va中文字幕 | 亚洲欧美精品伊人久久 | 狠狠综合久久久久综合网 | 亚洲gv猛男gv无码男同 | 亚洲乱码国产乱码精品精 | 午夜理论片yy44880影院 | 久久国产36精品色熟妇 | 丰满少妇高潮惨叫视频 | 免费播放一区二区三区 | 精品国产成人一区二区三区 | 人人澡人人透人人爽 | 精品无码国产自产拍在线观看蜜 | 无码国产激情在线观看 | 亚洲精品一区二区三区大桥未久 | 久久精品视频在线看15 | 人妻少妇精品视频专区 | 学生妹亚洲一区二区 | 无码免费一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 午夜精品久久久内射近拍高清 | 国产精品人妻一区二区三区四 | 波多野结衣 黑人 | 中文字幕人妻无码一夲道 | 夫妻免费无码v看片 | 亚洲精品久久久久中文第一幕 | 啦啦啦www在线观看免费视频 | 亚洲精品国产第一综合99久久 | 精品久久久久久人妻无码中文字幕 | 老太婆性杂交欧美肥老太 | 鲁大师影院在线观看 | 中文字幕无码av激情不卡 | 色 综合 欧美 亚洲 国产 | 欧美丰满熟妇xxxx性ppx人交 | 中文字幕色婷婷在线视频 | 久久综合给合久久狠狠狠97色 | 内射白嫩少妇超碰 | 国产9 9在线 | 中文 | 国产成人无码av一区二区 | 国内老熟妇对白xxxxhd | 日韩 欧美 动漫 国产 制服 | 国产黑色丝袜在线播放 | 久久亚洲日韩精品一区二区三区 | 久久99精品国产麻豆蜜芽 | 5858s亚洲色大成网站www | 国产综合在线观看 | av无码不卡在线观看免费 | 亚洲国产精品无码久久久久高潮 | www国产精品内射老师 | 日本一本二本三区免费 | 国产欧美亚洲精品a | 人人妻人人澡人人爽欧美一区九九 | 婷婷五月综合激情中文字幕 | 又大又紧又粉嫩18p少妇 | 亚洲自偷自偷在线制服 | 永久免费观看美女裸体的网站 | 奇米影视7777久久精品 | 日韩人妻少妇一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 久久国产精品萌白酱免费 | 午夜免费福利小电影 | 国内老熟妇对白xxxxhd | 亚洲一区二区三区香蕉 | 国产在线精品一区二区三区直播 | 国色天香社区在线视频 | 国产熟妇高潮叫床视频播放 | 亚洲精品久久久久中文第一幕 | 熟女少妇人妻中文字幕 | 精品亚洲成av人在线观看 | 国产在线精品一区二区高清不卡 | 亚洲一区二区三区四区 | 久久久久成人片免费观看蜜芽 | 人人澡人摸人人添 | 99久久人妻精品免费一区 | 人人妻人人藻人人爽欧美一区 | 丰满肥臀大屁股熟妇激情视频 | 又湿又紧又大又爽a视频国产 | 日韩无套无码精品 | 亚洲男人av香蕉爽爽爽爽 | 欧美日本日韩 | 乌克兰少妇性做爰 | 少妇一晚三次一区二区三区 | 成人性做爰aaa片免费看 | 成熟女人特级毛片www免费 | 国产成人av免费观看 | 国产电影无码午夜在线播放 | 久久久av男人的天堂 | 国产特级毛片aaaaaaa高清 | 99精品国产综合久久久久五月天 | 精品少妇爆乳无码av无码专区 | a国产一区二区免费入口 | av无码不卡在线观看免费 | 蜜桃臀无码内射一区二区三区 | 亚洲а∨天堂久久精品2021 | 亚洲男人av香蕉爽爽爽爽 | 亚洲天堂2017无码中文 | 亚洲精品综合一区二区三区在线 | 奇米影视7777久久精品人人爽 | www国产亚洲精品久久久日本 | 麻豆人妻少妇精品无码专区 | 麻豆果冻传媒2021精品传媒一区下载 | 色爱情人网站 | 久久国产精品偷任你爽任你 | 午夜理论片yy44880影院 | 久久99热只有频精品8 | 我要看www免费看插插视频 | 午夜精品一区二区三区在线观看 | 精品无码一区二区三区的天堂 | 亚洲色欲久久久综合网东京热 | 在线观看国产午夜福利片 | 国产香蕉尹人综合在线观看 | www成人国产高清内射 | 动漫av一区二区在线观看 | 在线观看免费人成视频 | 国内少妇偷人精品视频免费 | 双乳奶水饱满少妇呻吟 | 中文字幕人妻无码一夲道 | 国产偷自视频区视频 | 国产欧美亚洲精品a | 日韩精品一区二区av在线 | 精品无码成人片一区二区98 | 成人免费视频视频在线观看 免费 | 无码成人精品区在线观看 | 乌克兰少妇性做爰 | 在线精品亚洲一区二区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 熟妇人妻激情偷爽文 | 天天躁夜夜躁狠狠是什么心态 | 中文字幕人成乱码熟女app | 亚洲熟女一区二区三区 | 一本加勒比波多野结衣 | 亚洲成在人网站无码天堂 | 四虎国产精品免费久久 | 国产精品对白交换视频 | 无码毛片视频一区二区本码 | 亚洲s码欧洲m码国产av | 美女扒开屁股让男人桶 | 伊在人天堂亚洲香蕉精品区 | 久久久久久a亚洲欧洲av冫 | 丰满人妻被黑人猛烈进入 | 嫩b人妻精品一区二区三区 | 亚洲午夜久久久影院 | 色婷婷香蕉在线一区二区 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品一区二区三区四区五区 | 荡女精品导航 | 又大又硬又爽免费视频 | 亚洲欧洲日本无在线码 | 免费观看激色视频网站 | 日本熟妇乱子伦xxxx | 又大又硬又黄的免费视频 | 欧美亚洲国产一区二区三区 | 亚洲成av人综合在线观看 | 精品水蜜桃久久久久久久 | 无码免费一区二区三区 | 欧美精品免费观看二区 | 大地资源网第二页免费观看 | 无码人中文字幕 | 蜜臀av在线播放 久久综合激激的五月天 | 性色av无码免费一区二区三区 | 中文字幕无线码免费人妻 | 黑人巨大精品欧美一区二区 | 性史性农村dvd毛片 | 国产在线aaa片一区二区99 | 国产亚洲精品久久久久久久 | 国产精品无码一区二区三区不卡 | 无码人妻精品一区二区三区下载 | 一本无码人妻在中文字幕免费 | 特大黑人娇小亚洲女 | 国产极品视觉盛宴 | 大地资源中文第3页 | 色欲综合久久中文字幕网 | 国产免费观看黄av片 | 欧美精品免费观看二区 | 久久精品中文字幕大胸 | 国产精品二区一区二区aⅴ污介绍 | 四虎影视成人永久免费观看视频 | 日本乱人伦片中文三区 | 欧美国产日产一区二区 | 国语自产偷拍精品视频偷 | 欧美熟妇另类久久久久久多毛 | 精品一区二区三区无码免费视频 | 国产精品人妻一区二区三区四 | 国产精品高潮呻吟av久久 | 成人综合网亚洲伊人 | 精品国产成人一区二区三区 | 国产午夜亚洲精品不卡下载 | 人人澡人人妻人人爽人人蜜桃 | 高清无码午夜福利视频 | 亚洲色偷偷偷综合网 | 国产人妖乱国产精品人妖 | 强伦人妻一区二区三区视频18 | 欧美日韩视频无码一区二区三 | 日韩视频 中文字幕 视频一区 | 久久久精品欧美一区二区免费 | 久久精品中文闷骚内射 | 亚洲国产精品美女久久久久 | 黑人巨大精品欧美黑寡妇 | 中国女人内谢69xxxxxa片 | 国语自产偷拍精品视频偷 | 好男人社区资源 | 精品国产福利一区二区 | 国产农村妇女高潮大叫 | 粉嫩少妇内射浓精videos | 国产热a欧美热a在线视频 | 日本免费一区二区三区最新 | 无码精品人妻一区二区三区av | 十八禁真人啪啪免费网站 | 精品久久久无码中文字幕 | 性做久久久久久久免费看 | 成人精品天堂一区二区三区 | 无套内射视频囯产 | 成人性做爰aaa片免费看 | 国产精品美女久久久久av爽李琼 | 性色欲情网站iwww九文堂 | 色 综合 欧美 亚洲 国产 | 99麻豆久久久国产精品免费 | 国产又粗又硬又大爽黄老大爷视 | 丝袜美腿亚洲一区二区 | ass日本丰满熟妇pics | 熟女体下毛毛黑森林 | 亚洲aⅴ无码成人网站国产app | 一本色道婷婷久久欧美 | 国产精品多人p群无码 | 亚洲理论电影在线观看 | 国产舌乚八伦偷品w中 | 波多野结衣高清一区二区三区 | 四虎国产精品免费久久 | 清纯唯美经典一区二区 | 丝袜人妻一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 国产精品爱久久久久久久 | 欧美色就是色 | 无码任你躁久久久久久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 疯狂三人交性欧美 | 国产成人一区二区三区别 | 牲欲强的熟妇农村老妇女视频 | 国产午夜亚洲精品不卡 | 欧美高清在线精品一区 | 色综合视频一区二区三区 | 欧美 日韩 亚洲 在线 | 成人一区二区免费视频 | 牛和人交xxxx欧美 | 亚洲精品国产第一综合99久久 | 露脸叫床粗话东北少妇 | 最新版天堂资源中文官网 | 日本又色又爽又黄的a片18禁 | 黑人巨大精品欧美一区二区 | 国产精品久久久久影院嫩草 | 97色伦图片97综合影院 | 一本色道久久综合亚洲精品不卡 | 久久综合九色综合97网 | 99久久久国产精品无码免费 | 最新国产麻豆aⅴ精品无码 | 亚洲国产av美女网站 | 天天躁夜夜躁狠狠是什么心态 | 奇米影视7777久久精品人人爽 | 无码午夜成人1000部免费视频 | 亚洲色欲久久久综合网东京热 | 欧美丰满熟妇xxxx | 亚洲精品一区二区三区在线观看 | 精品国产aⅴ无码一区二区 | 亚欧洲精品在线视频免费观看 | 国产片av国语在线观看 | 人妻aⅴ无码一区二区三区 | 色综合视频一区二区三区 | 青青青爽视频在线观看 | 影音先锋中文字幕无码 | 国产又爽又猛又粗的视频a片 | 大肉大捧一进一出视频出来呀 | 国精产品一区二区三区 | 欧美人与善在线com | a在线亚洲男人的天堂 | 无套内谢的新婚少妇国语播放 | 无码国产乱人伦偷精品视频 | 2020久久超碰国产精品最新 | 欧美乱妇无乱码大黄a片 | 欧美丰满老熟妇xxxxx性 | 激情内射亚州一区二区三区爱妻 | 97夜夜澡人人双人人人喊 | 牲欲强的熟妇农村老妇女视频 | 久久午夜无码鲁丝片 | 美女黄网站人色视频免费国产 | 中文字幕无线码免费人妻 | 免费人成在线视频无码 | 精品国精品国产自在久国产87 | 中文字幕久久久久人妻 | 日日噜噜噜噜夜夜爽亚洲精品 | 成人免费无码大片a毛片 | 亚洲色www成人永久网址 | 亚洲精品一区二区三区婷婷月 | 亚洲精品一区三区三区在线观看 | 无遮无挡爽爽免费视频 | 亚洲色在线无码国产精品不卡 | 成人动漫在线观看 | 欧美丰满老熟妇xxxxx性 | 亚洲 日韩 欧美 成人 在线观看 | 人妻尝试又大又粗久久 | 亚洲精品www久久久 | 一本久久a久久精品亚洲 | 最新国产乱人伦偷精品免费网站 | 四十如虎的丰满熟妇啪啪 | 欧美一区二区三区视频在线观看 | 精品无码国产自产拍在线观看蜜 | 国产性生交xxxxx无码 | 最新版天堂资源中文官网 | 伊人久久大香线蕉亚洲 | 久久www免费人成人片 | 亚洲中文字幕va福利 | 亚洲熟悉妇女xxx妇女av | 欧美丰满熟妇xxxx | 久久亚洲a片com人成 | 蜜桃视频插满18在线观看 | 狠狠噜狠狠狠狠丁香五月 | 曰本女人与公拘交酡免费视频 | 无码国产乱人伦偷精品视频 | 欧美性猛交xxxx富婆 | 丰满肥臀大屁股熟妇激情视频 | 色情久久久av熟女人妻网站 | 久久www免费人成人片 | 国产人成高清在线视频99最全资源 | 在线精品国产一区二区三区 | 亚洲国产精品久久久久久 | 亚洲欧美国产精品专区久久 |