3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Beautiful Soup 4.4.0 文檔?

Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.

這篇文檔介紹了BeautifulSoup4中所有主要特性,并且有小例子.讓我來向你展示它適合做什么,如何工作,怎樣使用,如何達到你想要的效果,和處理異常情況.

文檔中出現的例子在Python2.7和Python3.2中的執行結果相同

你可能在尋找 Beautiful Soup3 的文檔,Beautiful Soup 3 目前已經停止開發,我們推薦在現在的項目中使用Beautiful Soup 4, 移植到BS4

這篇幫助文檔已經被翻譯成了其它語言:

  • 這篇文檔當然還有中文版.
  • このページは日本語で利用できます(外部リンク)
  • ? ??? ??? ??? ?????. (?? ??)

尋求幫助?

如果你有關于BeautifulSoup的問題,可以發送郵件到 討論組 .如果你的問題包含了一段需要轉換的HTML代碼,那么確保你提的問題描述中附帶這段HTML文檔的 代碼診斷 [1]

快速開始?

下面的一段HTML代碼將作為例子被多次用到.這是 愛麗絲夢游仙境的 的一段內容(以后內容中簡稱為 愛麗絲 的文檔):

html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <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>
“”"

使用BeautifulSoup解析這段代碼,能夠得到一個 BeautifulSoup 的對象,并能按照標準的縮進格式的結構輸出:

from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())
# <html>
# <head>
# <title>
# The Dormouse’s story
# </title>
# </head>
# <body>
# <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 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=“link2”>
# Tillie
# </a>
# ; and they lived at the bottom of a well.
# </p>
# <p class=“story”>
# …
# </p>
# </body>
# </html>

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

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,那么可以通過系統的軟件包管理來安裝:

$ apt-get install Python-bs4

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

$ easy_install beautifulsoup4

$ pip install beautifulsoup4

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

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

$ Python setup.py install

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

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

安裝完成后的問題?

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

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

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

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

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

$ Python3 setup.py install

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

$ 2to3-3.2 -w bs4

安裝解析器?

Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,其中一個是 lxml .根據操作系統不同,可以選擇下列方法來安裝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

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

解析器使用方法優勢劣勢
Python標準庫BeautifulSoup(markup, "html.parser")
  • Python的內置標準庫
  • 執行速度適中
  • 文檔容錯能力強
  • 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解析方法不夠穩定.

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

如何使用?

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

from bs4 import BeautifulSoup

soup = 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文檔轉換成一個復雜的樹形結構,每個節點都是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已方法已經執行結束,該對象的輸出也會帶有對象的引用地址.這樣會浪費內存.

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> <body> <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, ‘html.parser’)

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

子節點?

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

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

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的子節點以列表的方式輸出:

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 對象本身一定會包含子節點,也就是說<html>標簽也是 BeautifulSoup 對象的子節點:

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

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

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

通過tag的 .children 生成器,可以對tag的子節點進行循環:

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

.descendants?

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

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

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

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

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

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

.string?

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

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

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

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

head_tag.string
# u’The Dormouse’s story’

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

print(soup.html.string) # None

.strings 和 stripped_strings?

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

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'...'

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

父節點?

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

.parent?

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

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

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

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

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

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

BeautifulSoup 對象的 .parent 是None:

print(soup.parent) # None

.parents?

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

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

兄弟節點?

看一段簡單的例子:

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

.next_sibling 和 .previous_sibling?

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

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

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

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

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

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

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 屬性可以對當前節點的兄弟節點迭代輸出:

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> <body> <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, ‘html.parser’)

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

過濾器?

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

字符串?

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

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

如果傳入字節碼參數,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,但是不會返回字符串節點

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”屬性.

通過一個方法來過濾一類標簽屬性的時候, 這個方法的參數是要被過濾的屬性的值, 而不是這個標簽. 下面的例子是找出 href 屬性不符合指定正則的 a 標簽.

def not_lacie(href):return href and not re.compile("lacie").search(href) soup.find_all(href=not_lacie) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

標簽過濾方法可以使用復雜方法. 下面的例子可以過濾出前后都有文字的標簽.

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

現在來了解一下搜索方法的細節

find_all()?

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

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

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(string=re.compile(“sisters”))
# u’Once upon a time there were three little sisters; and their names were\n’

有幾個方法很相似,還有幾個方法是新的,參數中的 stringid 是什么含義? 為什么 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>]

string 參數?

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

soup.find_all(string="Elsie") # [u'Elsie']

soup.find_all(string=[“Tillie”, “Elsie”, “Lacie”])
# [u’Elsie’, u’Lacie’, u’Tillie’]

soup.find_all(string=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(string=is_the_only_string_within_a_tag)
# [u"The Dormouse’s story", u"The Dormouse’s story", u’Elsie’, u’Lacie’, u’Tillie’, u’…’]

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

soup.find_all("a", string="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的所有子孫節點,如果只想搜索tag的直接子節點,可以使用參數 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)
# []

這是文檔片段

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

<title>標簽在 <html> 標簽下, 但并不是直接子節點, <head> 標簽才是直接子節點. 在允許查詢所有后代節點時 Beautiful Soup 能夠查找到 <title> 標簽. 但是使用了 recursive=False 參數之后,只能查找直接子節點,這樣就查不到 <title> 標簽了.

Beautiful Soup 提供了多種DOM樹搜索方法. 這些方法都使用了類似的參數定義. 比如這些方法: find_all(): name, attrs, text, limit. 但是只有 find_all()find() 支持 recursive 參數.

像調用 find_all() 一樣調用tag?

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

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

這兩行代碼也是等價的:

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

find()?

find( name , attrs , recursive , string , **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>

唯一的區別是 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 , string , **kwargs )

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

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

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

a_string = soup.find(string="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>標簽是是當前葉子節點的直接父節點,所以可以被找到.還有一個<p>標簽,是目標葉子節點的間接父輩節點,所以也可以被找到.包含class值為”title”的<p>標簽不是不是目標葉子節點的父輩節點,所以通過 find_parents() 方法搜索不到.

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

find_next_siblings() 和 find_next_sibling()?

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

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

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

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 , string , **kwargs )

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

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

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 , string , **kwargs )

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

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

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

first_link.find_all_next(string=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 , string , **kwargs )

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

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

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選擇器 http://www.w3.org/TR/CSS2/selector.html [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”)
# []

找到兄弟節點標簽:

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>]

同時用多種CSS選擇器查詢元素:

soup.select("#link1,#link2") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <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>]

返回查找到的元素的第一個

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

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

修改文檔樹?

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

修改tag的名稱和屬性?

在 Attributes 的章節中已經介紹過這個功能,但是再看一遍也無妨. 重命名一個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’]

NavigableString() 和 .new_tag()?

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

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

如果想要創建一段注釋,或 NavigableString 的任何子類, 只要調用 NavigableString 的構造方法:

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 中新增的方法

創建一個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() 方法類似,區別是不會把新元素添加到父節點 .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或文本節點前插入內容:

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或文本節點后插入內容:

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可以繼續調用 extract 方法:

my_string = i_tag.string.extract() my_string # u'example.com'

print(my_string.parent)
# None
i_tag
# <i></i>

decompose()?

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

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或文本節點替代它:

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或文本節點,可以用來瀏覽或添加到文檔樹其它地方

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節點都可以調用 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() 方法獲得字節碼或調用 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文檔,只要用文檔創建 BeautifulSoup 對象就可以了.Beautiful Soup會自動選擇一個解析器來解析文檔.但是還可以通過參數指定使用那種解析器來解析當前文檔.

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

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

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

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

解析器之間的區別?

Beautiful Soup為不同的解析器提供了相同的接口,但解析器本身時有區別的.同一篇文檔被不同的解析器解析后可能會生成不同結構的樹型文檔.區別最大的是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解析器之間也有區別,如果被解析的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庫不同的是標準庫沒有嘗試創建符合標準的文檔格式或將文檔片段包含在<body>標簽內,與lxml不同的是標準庫甚至連<html>標簽都沒有嘗試去添加.

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

不同的解析器可能影響代碼執行結果,如果在分發給別人的代碼中使用了 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'

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

如果僅知道文檔采用了Unicode編碼, 但不知道具體編碼. 可以先自己猜測, 猜測錯誤(依舊是亂碼)時, 可以把錯誤編碼作為 exclude_encodings 參數, 這樣文檔就不會嘗試使用這種編碼了解碼了. 譯者備注: 在沒有指定編碼的情況下, BS會自己猜測編碼, 把不正確的編碼排除掉, BS就更容易猜到正確編碼.

soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"]) soup.h1 <h1>????</h1> soup.original_encoding 'WINDOWS-1255'

猜測結果是 Windows-1255 編碼, 猜測結果可能不夠準確, 但是 Windows-1255 編碼是 ISO-8859-8 的擴展集, 所以猜測結果已經十分接近了, 并且不影響使用. (exclude_encodings 參數是 4.4.0版本的新功能)

少數情況下(通常是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 對象或任意節點的 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! (亂碼, 靠!)?

譯者備注: UnicodeDammit 是BS內置庫, 主要用來猜測文檔編碼.

編碼自動檢測 功能可以在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 那么編碼檢測功能的準確率將大大提高. 輸入的字符越多,檢測結果越精確,如果事先猜測到一些可能編碼, 那么可以將猜測的編碼作為參數,這樣將優先檢測這些編碼:

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編碼內容,但這解決了最常見的一類問題.

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

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

比較對象是否相同?

兩個 NavigableStringTag 對象具有相同的HTML或XML結構時, Beautiful Soup就判斷這兩個對象相同. 這個例子中, 2個 <b> 標簽在 BS 中是相同的, 盡管他們在文檔樹的不同位置, 但是具有相同的表象: “<b>pizza</b>”

markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>" soup = BeautifulSoup(markup, 'html.parser') first_b, second_b = soup.find_all('b') print first_b == second_b # True

print first_b.previous_element == second_b.previous_element
# False

如果想判斷兩個對象是否嚴格的指向同一個對象可以通過 is 來判斷

print first_b is second_b # False

復制Beautiful Soup對象?

copy.copy() 方法可以復制任意 TagNavigableString 對象

import copy p_copy = copy.copy(soup.p) print p_copy # <p>I want <b>pizza</b> and more <b>pizza</b>!</p>

復制后的對象跟與對象是相等的, 但指向不同的內存地址

print soup.p == p_copy # True

print soup.p is p_copy
# False

源對象和復制對象的區別是源對象在文檔樹中, 而復制后的對象是獨立的還沒有添加到文檔樹中. 復制后對象的效果跟調用了 extract() 方法相同.

print p_copy.parent # None

這是因為相等的對象不能同時插入相同的位置

解析部分文檔?

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

SoupStrainer?

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

from bs4 import SoupStrainer

only_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(string=is_short_string)

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

html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <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的代碼寫的太優秀,而是因為Beautiful Soup沒有包含任何文檔解析代碼.異常產生自被依賴的解析器,如果解析器不能很好的解析出當前的文檔,那么最好的辦法是換一個解析器.更多細節查看 安裝解析器 章節.

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

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

版本錯誤?

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

解析成XML?

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

soup = BeautifulSoup(markup, "xml")

當然,還需要 安裝lxml

解析器的錯誤?

  • 如果同樣的代碼在不同環境下結果不同,可能是因為兩個環境下使用不同的解析器造成的.例如這個環境中安裝了lxml,而另一個環境中只有html5lib, 解析器之間的區別 中說明了原因.修復方法是在 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或文本節點使用,實際上返回結果是一個列表或 ResultSet 對象的字符串,需要對結果進行循環才能得到每個節點的 .foo 屬性.或者使用 find() 方法僅獲取到一個節點
  • AttributeError: 'NoneType' object has no attribute 'foo' 這個錯誤通常是在調用了 find() 方法后直節點取某個屬性 .foo 但是 find() 方法并沒有找到任何結果,所以它的返回值是 None .需要找出為什么 find() 的返回值是 None .

如何提高效率?

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

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

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

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

Beautiful Soup 3?

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

$ apt-get install Python-beautifulsoup

在PyPi中分發的包名字是 BeautifulSoup :

$ easy_install BeautifulSoup

$ pip install BeautifulSoup

或通過 Beautiful Soup 3.2.0源碼包 安裝

Beautiful Soup 3的在線文檔查看 這里 .

遷移到BS4?

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

from BeautifulSoup import BeautifulSoup

修改為:

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

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

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

需要的解析器?

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

因為解析器 html.parserSGMLParser 不同. BS4 和 BS3 處理相同的文檔會產生不同的對象結構. 使用lxml或html5lib解析文檔的時候, 如果添加了 html.parser 參數, 解析的對象又回發生變化. 如果發生了這種情況, 只能修改對應的處文檔結果處理代碼了.

方法名的變化?

  • 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()

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

  • Tag.isSelfClosing -> Tag.is_empty_element

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

  • 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中有的生成器循環結束后會返回 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將所有空標簽解析為空元素,如果向空元素中添加子節點,那么這個元素就不再是空元素了.

實體?

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

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

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

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

附錄?

[1]BeautifulSoup的google討論組不是很活躍,可能是因為庫已經比較完善了吧,但是作者還是會很熱心的盡量幫你解決問題的.
[2](1, 2) 文檔被解析成樹形結構,所以下一步解析過程應該是當前節點的子節點
[3]過濾器只能作為搜索文檔的參數,或者說應該叫參數類型更為貼切,原文中用了 filter 因此翻譯為過濾器
[4]元素參數,HTML文檔中的一個tag節點,不能是文本節點
[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依然在執行 wrap() 方法的tag內
[9]文檔中特殊編碼字符被替換成特殊字符(通常是�)的過程是Beautful Soup自動實現的,如果想要多種編碼格式的文檔被完全轉換正確,那么,只好,預先手動處理,統一編碼格式
[10](1, 2) 智能引號,常出現在microsoft的word軟件中,即在某一段落中按引號出現的順序每個引號都被自動轉換為左引號,或右引號.

原文: http://www.crummy.com/software/BeautifulSoup/bs4/doc/

翻譯: Deron Wang

查看 BeautifulSoup3 文檔

<div id="rtd-378ya9ma" class="ethical-alabaster"></div></div>

總結

以上是生活随笔為你收集整理的Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档的全部內容,希望文章能夠幫你解決所遇到的問題。

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

大乳丰满人妻中文字幕日本 | 麻花豆传媒剧国产免费mv在线 | 无码精品人妻一区二区三区av | 日本熟妇大屁股人妻 | 中国大陆精品视频xxxx | 青青久在线视频免费观看 | 精品国产一区二区三区av 性色 | 理论片87福利理论电影 | 久久99国产综合精品 | 久久精品无码一区二区三区 | 亚洲乱码中文字幕在线 | 丰满诱人的人妻3 | 亚洲精品国产第一综合99久久 | 国产在线一区二区三区四区五区 | 亚洲成av人片在线观看无码不卡 | 亚洲精品中文字幕久久久久 | 日本熟妇浓毛 | 久久久久久av无码免费看大片 | 色一情一乱一伦一视频免费看 | 亚洲国产一区二区三区在线观看 | 精品久久8x国产免费观看 | 日本一卡2卡3卡四卡精品网站 | 国产成人无码av片在线观看不卡 | 精品国产av色一区二区深夜久久 | 99久久亚洲精品无码毛片 | 国产av无码专区亚洲a∨毛片 | 国产av一区二区精品久久凹凸 | 欧洲欧美人成视频在线 | 国产国语老龄妇女a片 | 色欲综合久久中文字幕网 | 亚洲成av人影院在线观看 | 男女爱爱好爽视频免费看 | 亚洲精品一区二区三区在线 | 午夜精品一区二区三区的区别 | 亚洲成a人片在线观看无码 | 动漫av一区二区在线观看 | 亚洲欧美国产精品专区久久 | 国产精品内射视频免费 | 欧美亚洲国产一区二区三区 | 蜜臀av在线播放 久久综合激激的五月天 | 任你躁国产自任一区二区三区 | 国产av一区二区三区最新精品 | 欧美熟妇另类久久久久久多毛 | 日本熟妇人妻xxxxx人hd | 国内少妇偷人精品视频 | 俺去俺来也www色官网 | 无码午夜成人1000部免费视频 | 暴力强奷在线播放无码 | www国产精品内射老师 | 午夜性刺激在线视频免费 | 人人妻在人人 | 俺去俺来也www色官网 | 国产精品视频免费播放 | 国产激情精品一区二区三区 | 无码精品国产va在线观看dvd | 鲁一鲁av2019在线 | 欧美肥老太牲交大战 | 久久久久av无码免费网 | 又大又紧又粉嫩18p少妇 | 日本精品人妻无码77777 天堂一区人妻无码 | 色老头在线一区二区三区 | 高潮毛片无遮挡高清免费 | 国产成人人人97超碰超爽8 | 精品一二三区久久aaa片 | 妺妺窝人体色www婷婷 | 精品一区二区不卡无码av | 1000部夫妻午夜免费 | 天堂а√在线中文在线 | 亚洲成a人片在线观看无码3d | 国产精品久久国产三级国 | 亚洲国产精品久久人人爱 | aⅴ亚洲 日韩 色 图网站 播放 | 美女张开腿让人桶 | 色老头在线一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 300部国产真实乱 | 俄罗斯老熟妇色xxxx | 久久99精品国产麻豆 | 国精品人妻无码一区二区三区蜜柚 | 成人欧美一区二区三区黑人免费 | 超碰97人人射妻 | 人人澡人摸人人添 | 亚洲成a人片在线观看无码3d | 国产在线精品一区二区高清不卡 | 一个人看的www免费视频在线观看 | 天天爽夜夜爽夜夜爽 | 国产精品a成v人在线播放 | 亚洲成a人一区二区三区 | 免费观看的无遮挡av | 老子影院午夜精品无码 | 成人动漫在线观看 | 色五月五月丁香亚洲综合网 | 国产精品办公室沙发 | 亚洲日本va中文字幕 | 亚洲无人区一区二区三区 | 欧美人与动性行为视频 | 西西人体www44rt大胆高清 | 久久99精品久久久久久 | 中国大陆精品视频xxxx | 无套内射视频囯产 | 亚洲国产日韩a在线播放 | 99riav国产精品视频 | 精品水蜜桃久久久久久久 | 草草网站影院白丝内射 | 野外少妇愉情中文字幕 | 国产三级精品三级男人的天堂 | 好男人www社区 | 伊人久久大香线蕉午夜 | 精品无码成人片一区二区98 | 国内精品一区二区三区不卡 | 人妻体内射精一区二区三四 | 在线а√天堂中文官网 | 中文字幕精品av一区二区五区 | 97夜夜澡人人爽人人喊中国片 | 亚洲无人区午夜福利码高清完整版 | 中文精品无码中文字幕无码专区 | 亚洲天堂2017无码中文 | 性生交大片免费看l | 久久精品国产一区二区三区肥胖 | 大屁股大乳丰满人妻 | 国产日产欧产精品精品app | 好爽又高潮了毛片免费下载 | 天天做天天爱天天爽综合网 | 扒开双腿吃奶呻吟做受视频 | 欧美激情综合亚洲一二区 | √天堂中文官网8在线 | 免费国产成人高清在线观看网站 | 性欧美牲交xxxxx视频 | 内射老妇bbwx0c0ck | 国产午夜无码精品免费看 | 扒开双腿疯狂进出爽爽爽视频 | 精品国产麻豆免费人成网站 | 乱人伦人妻中文字幕无码久久网 | 又大又黄又粗又爽的免费视频 | 内射欧美老妇wbb | 国产亚洲精品久久久久久久 | 亚洲熟妇自偷自拍另类 | 九一九色国产 | 97夜夜澡人人爽人人喊中国片 | 欧美精品国产综合久久 | 六月丁香婷婷色狠狠久久 | 中文毛片无遮挡高清免费 | 亚洲国产精品久久久久久 | 欧美日本精品一区二区三区 | 色综合久久88色综合天天 | 女人被男人躁得好爽免费视频 | 狠狠色噜噜狠狠狠7777奇米 | 日韩欧美群交p片內射中文 | 精品人人妻人人澡人人爽人人 | 国产偷抇久久精品a片69 | 水蜜桃亚洲一二三四在线 | 啦啦啦www在线观看免费视频 | 亚洲 日韩 欧美 成人 在线观看 | 久久久亚洲欧洲日产国码αv | 乱人伦人妻中文字幕无码久久网 | 国产午夜手机精彩视频 | 大乳丰满人妻中文字幕日本 | 18精品久久久无码午夜福利 | 国产综合在线观看 | 老熟妇仑乱视频一区二区 | 久久久久se色偷偷亚洲精品av | 精品日本一区二区三区在线观看 | 福利一区二区三区视频在线观看 | 成熟女人特级毛片www免费 | 美女黄网站人色视频免费国产 | 高中生自慰www网站 | 欧美老妇交乱视频在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 国产午夜亚洲精品不卡下载 | 国产成人精品久久亚洲高清不卡 | 国产亚av手机在线观看 | 一本久久a久久精品亚洲 | 搡女人真爽免费视频大全 | 55夜色66夜色国产精品视频 | 日欧一片内射va在线影院 | 国产精品va在线播放 | 精品无码国产一区二区三区av | 亚洲一区二区三区在线观看网站 | a在线亚洲男人的天堂 | 国产精品手机免费 | 无码国产激情在线观看 | 波多野结衣 黑人 | 熟妇人妻无乱码中文字幕 | 性色av无码免费一区二区三区 | 高潮喷水的毛片 | 国产三级久久久精品麻豆三级 | 夜夜高潮次次欢爽av女 | 亚洲精品一区二区三区婷婷月 | 全球成人中文在线 | 精品成人av一区二区三区 | 欧美黑人性暴力猛交喷水 | 亚洲国产精品久久人人爱 | 在线欧美精品一区二区三区 | 国产欧美精品一区二区三区 | 亚洲国产成人a精品不卡在线 | 精品人妻人人做人人爽 | 国产精品亚洲综合色区韩国 | 婷婷综合久久中文字幕蜜桃三电影 | 丰满人妻翻云覆雨呻吟视频 | 久久国产精品萌白酱免费 | 国产精华av午夜在线观看 | 最近中文2019字幕第二页 | 东京热无码av男人的天堂 | 97精品国产97久久久久久免费 | 无码午夜成人1000部免费视频 | 成熟妇人a片免费看网站 | 精品一二三区久久aaa片 | 人人超人人超碰超国产 | 免费观看的无遮挡av | 波多野结衣高清一区二区三区 | 性色欲情网站iwww九文堂 | 香港三级日本三级妇三级 | 亚洲娇小与黑人巨大交 | 亚洲中文字幕无码一久久区 | 免费无码的av片在线观看 | 国产sm调教视频在线观看 | 精品国产aⅴ无码一区二区 | 免费国产成人高清在线观看网站 | 欧洲欧美人成视频在线 | 亚洲欧美综合区丁香五月小说 | 亚洲精品国产精品乱码不卡 | 国产凸凹视频一区二区 | 欧美熟妇另类久久久久久不卡 | 俺去俺来也www色官网 | 99麻豆久久久国产精品免费 | 一区二区传媒有限公司 | 日日天干夜夜狠狠爱 | 亚洲中文字幕无码中文字在线 | 国产色视频一区二区三区 | 国内精品久久久久久中文字幕 | 国产成人无码一二三区视频 | 成人片黄网站色大片免费观看 | 无人区乱码一区二区三区 | 婷婷五月综合缴情在线视频 | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕人妻无码一区二区三区 | 午夜性刺激在线视频免费 | 一本色道久久综合狠狠躁 | 99久久精品国产一区二区蜜芽 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 东京一本一道一二三区 | 捆绑白丝粉色jk震动捧喷白浆 | 国产片av国语在线观看 | 亚洲精品国产品国语在线观看 | 99久久人妻精品免费一区 | 欧美国产亚洲日韩在线二区 | 亚洲男人av香蕉爽爽爽爽 | 国产偷抇久久精品a片69 | 扒开双腿疯狂进出爽爽爽视频 | 激情五月综合色婷婷一区二区 | 波多野42部无码喷潮在线 | 大肉大捧一进一出好爽视频 | 少妇太爽了在线观看 | 欧美日韩在线亚洲综合国产人 | 性色欲情网站iwww九文堂 | 亚洲中文字幕无码中文字在线 | 免费国产成人高清在线观看网站 | 免费无码午夜福利片69 | 麻豆国产人妻欲求不满 | 久久国产自偷自偷免费一区调 | 久久久久国色av免费观看性色 | 精品乱子伦一区二区三区 | 久久99精品国产麻豆蜜芽 | 中文字幕色婷婷在线视频 | 国产人妖乱国产精品人妖 | 亚洲色欲色欲欲www在线 | 男女超爽视频免费播放 | 免费无码一区二区三区蜜桃大 | 曰韩少妇内射免费播放 | 国产精品无码mv在线观看 | 国产一精品一av一免费 | 国产乱码精品一品二品 | 麻豆果冻传媒2021精品传媒一区下载 | 99久久99久久免费精品蜜桃 | 国产特级毛片aaaaaa高潮流水 | √8天堂资源地址中文在线 | 国产精品怡红院永久免费 | 国产婷婷色一区二区三区在线 | 99久久精品国产一区二区蜜芽 | 亲嘴扒胸摸屁股激烈网站 | 男女超爽视频免费播放 | 中文字幕乱码人妻无码久久 | 国产精品丝袜黑色高跟鞋 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲中文字幕无码一久久区 | 欧美日韩亚洲国产精品 | 色一情一乱一伦一区二区三欧美 | 99精品无人区乱码1区2区3区 | 人人澡人人透人人爽 | 精品无码国产自产拍在线观看蜜 | 欧美变态另类xxxx | 国产av无码专区亚洲a∨毛片 | 国产成人无码av一区二区 | 欧美激情一区二区三区成人 | 久久久久亚洲精品中文字幕 | 免费网站看v片在线18禁无码 | 久久久久99精品成人片 | 麻豆人妻少妇精品无码专区 | 久久熟妇人妻午夜寂寞影院 | 自拍偷自拍亚洲精品被多人伦好爽 | 大屁股大乳丰满人妻 | a在线亚洲男人的天堂 | 精品欧美一区二区三区久久久 | 亚洲日韩av一区二区三区中文 | 亚洲日本一区二区三区在线 | 国产精品嫩草久久久久 | 精品熟女少妇av免费观看 | 中文字幕乱妇无码av在线 | 欧美丰满少妇xxxx性 | 国精产品一品二品国精品69xx | 久久精品国产一区二区三区 | 亚洲热妇无码av在线播放 | 免费看男女做好爽好硬视频 | 亚洲精品无码人妻无码 | 98国产精品综合一区二区三区 | 俄罗斯老熟妇色xxxx | 久激情内射婷内射蜜桃人妖 | 久久久久亚洲精品中文字幕 | 亚洲国产精品久久久天堂 | 欧美日韩视频无码一区二区三 | 久久精品国产99精品亚洲 | 人人妻人人澡人人爽欧美精品 | 少妇久久久久久人妻无码 | 7777奇米四色成人眼影 | 性生交片免费无码看人 | 精品成在人线av无码免费看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 婷婷丁香六月激情综合啪 | 欧美日本精品一区二区三区 | 丰腴饱满的极品熟妇 | 麻豆国产97在线 | 欧洲 | 国产欧美精品一区二区三区 | 少妇无套内谢久久久久 | 国产成人精品无码播放 | 久久五月精品中文字幕 | 国产亚av手机在线观看 | 大地资源中文第3页 | 少妇被黑人到高潮喷出白浆 | 亚洲精品国产a久久久久久 | 狠狠色丁香久久婷婷综合五月 | 国产精品久久国产三级国 | 老头边吃奶边弄进去呻吟 | 一本久久a久久精品vr综合 | 狠狠综合久久久久综合网 | 久久综合网欧美色妞网 | 在线亚洲高清揄拍自拍一品区 | 精品久久久久久人妻无码中文字幕 | 亚洲一区二区三区 | 免费人成网站视频在线观看 | 亚洲色成人中文字幕网站 | 国产精品久久国产精品99 | 国产午夜视频在线观看 | 免费国产成人高清在线观看网站 | 欧洲精品码一区二区三区免费看 | 欧美三级a做爰在线观看 | 中文字幕+乱码+中文字幕一区 | 国产精品18久久久久久麻辣 | 久久久久se色偷偷亚洲精品av | 欧美国产日产一区二区 | 国产艳妇av在线观看果冻传媒 | 国内丰满熟女出轨videos | 欧美日韩一区二区综合 | 日韩少妇白浆无码系列 | 中文字幕无码人妻少妇免费 | 最新国产麻豆aⅴ精品无码 | 装睡被陌生人摸出水好爽 | 亚洲の无码国产の无码步美 | 久久无码中文字幕免费影院蜜桃 | 国产偷抇久久精品a片69 | 国产婷婷色一区二区三区在线 | 乱码午夜-极国产极内射 | 色婷婷综合中文久久一本 | 国产在热线精品视频 | 欧美成人免费全部网站 | 亚洲国产精品无码一区二区三区 | 日本熟妇人妻xxxxx人hd | 日产精品99久久久久久 | 男女下面进入的视频免费午夜 | 97夜夜澡人人爽人人喊中国片 | 国产精品久久久久久亚洲影视内衣 | 精品水蜜桃久久久久久久 | 天天爽夜夜爽夜夜爽 | 久久人人爽人人爽人人片ⅴ | 好男人www社区 | 久久婷婷五月综合色国产香蕉 | 东京热男人av天堂 | 无码午夜成人1000部免费视频 | 国产精品国产自线拍免费软件 | 国精品人妻无码一区二区三区蜜柚 | 国产美女精品一区二区三区 | 中文字幕无码免费久久99 | 亚洲精品一区二区三区婷婷月 | 国产av人人夜夜澡人人爽麻豆 | 久久综合久久自在自线精品自 | 亚洲色www成人永久网址 | 国产精品无码一区二区桃花视频 | 国产做国产爱免费视频 | 狂野欧美性猛xxxx乱大交 | 97久久超碰中文字幕 | 国产人妻人伦精品1国产丝袜 | 国产肉丝袜在线观看 | 激情五月综合色婷婷一区二区 | 最新国产麻豆aⅴ精品无码 | 久久亚洲精品成人无码 | 亚洲人成无码网www | 天天爽夜夜爽夜夜爽 | 麻豆国产人妻欲求不满谁演的 | 1000部夫妻午夜免费 | 亚洲精品国产第一综合99久久 | 99精品视频在线观看免费 | 婷婷丁香五月天综合东京热 | 无码国产激情在线观看 | 国产精品99爱免费视频 | 野外少妇愉情中文字幕 | 精品无码成人片一区二区98 | 久久久久亚洲精品男人的天堂 | 国产午夜无码视频在线观看 | 美女扒开屁股让男人桶 | av无码电影一区二区三区 | 熟妇人妻无码xxx视频 | 久久久久亚洲精品男人的天堂 | 欧美大屁股xxxxhd黑色 | 久久久精品成人免费观看 | 日本va欧美va欧美va精品 | 欧美日韩综合一区二区三区 | 亚洲人成影院在线无码按摩店 | 丰满妇女强制高潮18xxxx | 国产av无码专区亚洲a∨毛片 | 一个人看的视频www在线 | 99久久人妻精品免费一区 | 中文字幕无码日韩欧毛 | 欧美成人午夜精品久久久 | 国产电影无码午夜在线播放 | 日韩精品乱码av一区二区 | 欧美午夜特黄aaaaaa片 | 桃花色综合影院 | 国产美女极度色诱视频www | 色窝窝无码一区二区三区色欲 | 色 综合 欧美 亚洲 国产 | 呦交小u女精品视频 | 88国产精品欧美一区二区三区 | 曰韩无码二三区中文字幕 | 一区二区三区高清视频一 | 亚洲热妇无码av在线播放 | 国产精品亚洲а∨无码播放麻豆 | 亚洲精品一区二区三区婷婷月 | 无码吃奶揉捏奶头高潮视频 | 在线观看欧美一区二区三区 | 亚洲日韩一区二区三区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 精品日本一区二区三区在线观看 | 西西人体www44rt大胆高清 | 国产乱人偷精品人妻a片 | 亚洲无人区午夜福利码高清完整版 | 亚洲七七久久桃花影院 | 午夜精品久久久久久久久 | 国产成人无码av片在线观看不卡 | 无码国内精品人妻少妇 | 日本一区二区三区免费高清 | 亚洲自偷自偷在线制服 | 亚洲国产欧美在线成人 | 免费乱码人妻系列无码专区 | 日韩人妻少妇一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 国产成人一区二区三区别 | 亚洲欧美日韩成人高清在线一区 | 亚洲精品成人av在线 | аⅴ资源天堂资源库在线 | 欧洲vodafone精品性 | 久久99精品国产.久久久久 | 亚洲啪av永久无码精品放毛片 | 欧美性猛交xxxx富婆 | 丰满人妻被黑人猛烈进入 | 强伦人妻一区二区三区视频18 | 国产免费久久精品国产传媒 | 国产精品丝袜黑色高跟鞋 | 全黄性性激高免费视频 | 日本熟妇人妻xxxxx人hd | 中文字幕日韩精品一区二区三区 | 亚洲天堂2017无码中文 | 中文字幕久久久久人妻 | 亚洲日本一区二区三区在线 | 精品水蜜桃久久久久久久 | 亚洲成av人片在线观看无码不卡 | 国产成人无码a区在线观看视频app | 久久精品人人做人人综合试看 | 又粗又大又硬毛片免费看 | 天天摸天天透天天添 | 亚洲区欧美区综合区自拍区 | 亚洲熟女一区二区三区 | 国产成人无码av片在线观看不卡 | 成人免费无码大片a毛片 | 国产乱人无码伦av在线a | 久久国产精品萌白酱免费 | 无码人妻出轨黑人中文字幕 | 97夜夜澡人人双人人人喊 | 麻豆国产人妻欲求不满谁演的 | 成熟妇人a片免费看网站 | 成人欧美一区二区三区黑人 | 97资源共享在线视频 | 国产精华av午夜在线观看 | 国产无遮挡又黄又爽免费视频 | 美女扒开屁股让男人桶 | 又粗又大又硬毛片免费看 | 亚洲精品午夜无码电影网 | 免费观看的无遮挡av | 欧美35页视频在线观看 | 国产精品无码永久免费888 | 精品国产福利一区二区 | 精品一区二区三区波多野结衣 | 亚洲乱码国产乱码精品精 | 日韩精品无码免费一区二区三区 | 熟妇人妻无码xxx视频 | 大地资源中文第3页 | 亚洲一区二区三区在线观看网站 | 国产精品人人妻人人爽 | 男女超爽视频免费播放 | 丰满人妻翻云覆雨呻吟视频 | 最新版天堂资源中文官网 | 国产激情无码一区二区app | 精品国精品国产自在久国产87 | 帮老师解开蕾丝奶罩吸乳网站 | 色窝窝无码一区二区三区色欲 | 综合激情五月综合激情五月激情1 | 内射白嫩少妇超碰 | 日本高清一区免费中文视频 | 成 人 网 站国产免费观看 | 东京热无码av男人的天堂 | 亚洲欧洲日本无在线码 | 人妻少妇被猛烈进入中文字幕 | 亚洲综合另类小说色区 | av在线亚洲欧洲日产一区二区 | 三上悠亚人妻中文字幕在线 | 老头边吃奶边弄进去呻吟 | 国产极品视觉盛宴 | 亚洲 激情 小说 另类 欧美 | 亚洲色偷偷男人的天堂 | 4hu四虎永久在线观看 | 国产精品无码一区二区三区不卡 | 精品久久久无码人妻字幂 | 一本大道久久东京热无码av | 夜夜躁日日躁狠狠久久av | 撕开奶罩揉吮奶头视频 | 久久久国产精品无码免费专区 | 亚洲色欲色欲欲www在线 | 免费看男女做好爽好硬视频 | 纯爱无遮挡h肉动漫在线播放 | 成人aaa片一区国产精品 | 成人亚洲精品久久久久软件 | 国产亚洲欧美在线专区 | 女人被男人爽到呻吟的视频 | 国产精品欧美成人 | 久久国产自偷自偷免费一区调 | 免费无码一区二区三区蜜桃大 | 亚洲国产精品一区二区美利坚 | 青青青手机频在线观看 | 成人亚洲精品久久久久 | 黑人粗大猛烈进出高潮视频 | 纯爱无遮挡h肉动漫在线播放 | 高清国产亚洲精品自在久久 | 丰满人妻一区二区三区免费视频 | 樱花草在线社区www | 捆绑白丝粉色jk震动捧喷白浆 | 九九久久精品国产免费看小说 | 国产成人精品必看 | 麻豆国产人妻欲求不满 | 欧美日韩亚洲国产精品 | 草草网站影院白丝内射 | 国产激情一区二区三区 | 丰满人妻精品国产99aⅴ | 97夜夜澡人人双人人人喊 | 日日碰狠狠丁香久燥 | 丝袜美腿亚洲一区二区 | 东京无码熟妇人妻av在线网址 | 强辱丰满人妻hd中文字幕 | 在线成人www免费观看视频 | 亚洲国精产品一二二线 | 国产精品久久久久久亚洲毛片 | 欧美日韩亚洲国产精品 | 少妇无码一区二区二三区 | 国产精品亚洲综合色区韩国 | 四虎国产精品免费久久 | 亚洲天堂2017无码 | 国产成人无码一二三区视频 | 18无码粉嫩小泬无套在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲爆乳精品无码一区二区三区 | 中文无码伦av中文字幕 | 日韩欧美中文字幕在线三区 | 丰满诱人的人妻3 | √天堂资源地址中文在线 | 国产无av码在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 丝袜人妻一区二区三区 | 国产午夜视频在线观看 | 又色又爽又黄的美女裸体网站 | 一个人看的www免费视频在线观看 | 在线看片无码永久免费视频 | 久久这里只有精品视频9 | 色婷婷综合激情综在线播放 | 国产做国产爱免费视频 | 乱码午夜-极国产极内射 | 久久久久se色偷偷亚洲精品av | 在线观看欧美一区二区三区 | 强奷人妻日本中文字幕 | 久久精品丝袜高跟鞋 | 国产 精品 自在自线 | 精品久久久无码中文字幕 | 1000部啪啪未满十八勿入下载 | 牲欲强的熟妇农村老妇女 | 欧美怡红院免费全部视频 | 国产成人亚洲综合无码 | 丰满少妇女裸体bbw | 国语自产偷拍精品视频偷 | 婷婷六月久久综合丁香 | 精品久久久久久亚洲精品 | 中文字幕无码免费久久99 | 无遮无挡爽爽免费视频 | 内射欧美老妇wbb | 骚片av蜜桃精品一区 | 日日碰狠狠躁久久躁蜜桃 | 男女下面进入的视频免费午夜 | 亚洲中文字幕无码一久久区 | 无遮挡啪啪摇乳动态图 | 国产一精品一av一免费 | 亚洲日韩av一区二区三区中文 | 自拍偷自拍亚洲精品10p | 国产手机在线αⅴ片无码观看 | 欧美丰满老熟妇xxxxx性 | 极品尤物被啪到呻吟喷水 | 狠狠噜狠狠狠狠丁香五月 | 男人的天堂2018无码 | 日韩精品久久久肉伦网站 | 日本护士xxxxhd少妇 | 亚洲乱码日产精品bd | 国产精品无码永久免费888 | 欧美精品一区二区精品久久 | 中文字幕无码热在线视频 | 亚洲小说春色综合另类 | 色婷婷av一区二区三区之红樱桃 | 国产suv精品一区二区五 | 未满成年国产在线观看 | 成在人线av无码免费 | 国产乱人偷精品人妻a片 | 男人和女人高潮免费网站 | 久久人人97超碰a片精品 | 乱码av麻豆丝袜熟女系列 | 国产美女精品一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 亚洲日韩av一区二区三区中文 | 亚洲熟妇色xxxxx亚洲 | 狂野欧美激情性xxxx | 日日噜噜噜噜夜夜爽亚洲精品 | 老太婆性杂交欧美肥老太 | 亚洲天堂2017无码 | 色综合天天综合狠狠爱 | 欧美精品一区二区精品久久 | 日日碰狠狠躁久久躁蜜桃 | 99久久婷婷国产综合精品青草免费 | 成人精品视频一区二区 | 久久亚洲精品中文字幕无男同 | 日韩精品a片一区二区三区妖精 | 亚洲日韩一区二区三区 | 亚洲精品无码国产 | 国内精品久久毛片一区二区 | 丰满护士巨好爽好大乳 | 动漫av网站免费观看 | 桃花色综合影院 | 无码人妻少妇伦在线电影 | 欧美丰满少妇xxxx性 | 色妞www精品免费视频 | 国产乱码精品一品二品 | 久久久av男人的天堂 | 九九热爱视频精品 | 日韩av无码中文无码电影 | 精品无码一区二区三区爱欲 | 国产一区二区不卡老阿姨 | 无码国内精品人妻少妇 | 亚洲日韩av一区二区三区中文 | 国产精品办公室沙发 | 色婷婷久久一区二区三区麻豆 | 国产乱人偷精品人妻a片 | 色综合久久中文娱乐网 | 无码人妻少妇伦在线电影 | 在线播放免费人成毛片乱码 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲中文字幕成人无码 | 噜噜噜亚洲色成人网站 | 国产黄在线观看免费观看不卡 | 狠狠亚洲超碰狼人久久 | 国产精品高潮呻吟av久久4虎 | 帮老师解开蕾丝奶罩吸乳网站 | 国产乱人伦偷精品视频 | 亚洲欧美色中文字幕在线 | 国产av一区二区精品久久凹凸 | 欧美变态另类xxxx | 麻豆国产人妻欲求不满谁演的 | 免费人成在线观看网站 | 日本熟妇浓毛 | 大肉大捧一进一出好爽视频 | 一本色道婷婷久久欧美 | 精品久久久久久人妻无码中文字幕 | 无码毛片视频一区二区本码 | 乱中年女人伦av三区 | 成人亚洲精品久久久久软件 | 中文无码成人免费视频在线观看 | 中文字幕 亚洲精品 第1页 | 国产综合在线观看 | 国产两女互慰高潮视频在线观看 | 欧美国产日韩亚洲中文 | 自拍偷自拍亚洲精品被多人伦好爽 | 荡女精品导航 | 黄网在线观看免费网站 | 国产一区二区三区四区五区加勒比 | 国产午夜视频在线观看 | 国产av久久久久精东av | 少妇性荡欲午夜性开放视频剧场 | 国产精品资源一区二区 | 最新版天堂资源中文官网 | 无码国产乱人伦偷精品视频 | 亚洲人成影院在线观看 | 青青青手机频在线观看 | 国产精品久久久久久亚洲影视内衣 | 亚洲熟妇色xxxxx亚洲 | 精品少妇爆乳无码av无码专区 | 麻豆国产丝袜白领秘书在线观看 | 国产莉萝无码av在线播放 | 成人欧美一区二区三区黑人 | 夜夜躁日日躁狠狠久久av | 少妇人妻大乳在线视频 | 国产精品久久久午夜夜伦鲁鲁 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 一个人看的视频www在线 | 国产真实乱对白精彩久久 | 熟女体下毛毛黑森林 | 久久精品国产大片免费观看 | 成人精品天堂一区二区三区 | 欧美高清在线精品一区 | 国产国产精品人在线视 | 日韩av无码一区二区三区 | 麻豆国产人妻欲求不满谁演的 | 麻豆国产人妻欲求不满 | 日本在线高清不卡免费播放 | 性史性农村dvd毛片 | 国产成人无码专区 | 无码纯肉视频在线观看 | 亚洲无人区午夜福利码高清完整版 | 亚洲综合无码久久精品综合 | 国产精品99久久精品爆乳 | 欧美日韩综合一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 成人免费无码大片a毛片 | 久久久久亚洲精品中文字幕 | 天下第一社区视频www日本 | 成人无码影片精品久久久 | 国产精品99久久精品爆乳 | 日韩精品a片一区二区三区妖精 | 亚洲 高清 成人 动漫 | 性欧美大战久久久久久久 | 久久亚洲中文字幕精品一区 | 亚洲精品久久久久久一区二区 | 亚洲中文字幕无码中文字在线 | 国产av一区二区三区最新精品 | 十八禁真人啪啪免费网站 | 夜夜影院未满十八勿进 | 国内揄拍国内精品人妻 | 免费播放一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 少妇性l交大片欧洲热妇乱xxx | 色五月五月丁香亚洲综合网 | 黑人巨大精品欧美黑寡妇 | 色综合视频一区二区三区 | 综合激情五月综合激情五月激情1 | 国产乱人偷精品人妻a片 | 亚洲中文字幕无码中字 | 蜜桃视频插满18在线观看 | 亚洲精品久久久久久久久久久 | 国产av一区二区精品久久凹凸 | 爱做久久久久久 | 亚洲の无码国产の无码影院 | 狂野欧美性猛交免费视频 | 国产亚洲精品久久久久久大师 | 亚洲天堂2017无码 | 真人与拘做受免费视频 | 高中生自慰www网站 | 久久久久久久人妻无码中文字幕爆 | 欧美日韩一区二区三区自拍 | 色老头在线一区二区三区 | 青青久在线视频免费观看 | 日本一卡2卡3卡四卡精品网站 | 理论片87福利理论电影 | 久久www免费人成人片 | 亚洲日韩av一区二区三区中文 | 精品无码一区二区三区的天堂 | 中文字幕人妻丝袜二区 | 亚洲区欧美区综合区自拍区 | 波多野结衣aⅴ在线 | 免费人成网站视频在线观看 | 九九在线中文字幕无码 | 无码免费一区二区三区 | 日韩av无码中文无码电影 | 中文字幕精品av一区二区五区 | 亚洲日本一区二区三区在线 | 中文久久乱码一区二区 | 无码av中文字幕免费放 | 人妻aⅴ无码一区二区三区 | 嫩b人妻精品一区二区三区 | av在线亚洲欧洲日产一区二区 | 中文字幕av无码一区二区三区电影 | 亚洲a无码综合a国产av中文 | 欧美怡红院免费全部视频 | yw尤物av无码国产在线观看 | 亚洲精品国产精品乱码视色 | 无码精品国产va在线观看dvd | 精品成人av一区二区三区 | 欧美激情内射喷水高潮 | 天堂а√在线中文在线 | 日本精品高清一区二区 | 日韩av无码一区二区三区不卡 | 国产亚洲tv在线观看 | 四虎4hu永久免费 | 欧美日韩在线亚洲综合国产人 | 精品人人妻人人澡人人爽人人 | 18无码粉嫩小泬无套在线观看 | 免费无码一区二区三区蜜桃大 | 日欧一片内射va在线影院 | 天天摸天天透天天添 | 极品尤物被啪到呻吟喷水 | 国产精品二区一区二区aⅴ污介绍 | 成人精品视频一区二区 | 久久99精品久久久久久 | 成 人 网 站国产免费观看 | 国内精品一区二区三区不卡 | 久久久久免费看成人影片 | 国产莉萝无码av在线播放 | 狂野欧美性猛xxxx乱大交 | 欧洲vodafone精品性 | 欧美35页视频在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 巨爆乳无码视频在线观看 | 九九久久精品国产免费看小说 | 在线亚洲高清揄拍自拍一品区 | 高潮喷水的毛片 | 日本精品人妻无码77777 天堂一区人妻无码 | 中文字幕亚洲情99在线 | 国产美女精品一区二区三区 | 亚洲国产高清在线观看视频 | 中文字幕av伊人av无码av | 日本一卡2卡3卡四卡精品网站 | ass日本丰满熟妇pics | 亚洲春色在线视频 | 久久99精品国产.久久久久 | 亚洲综合无码一区二区三区 | 性做久久久久久久久 | 极品尤物被啪到呻吟喷水 | www一区二区www免费 | 中文字幕无码热在线视频 | 色一情一乱一伦一视频免费看 | 男女爱爱好爽视频免费看 | 久久精品99久久香蕉国产色戒 | 76少妇精品导航 | 狠狠色色综合网站 | 成在人线av无码免观看麻豆 | 欧美三级a做爰在线观看 | 亚洲欧美色中文字幕在线 | 欧美人与禽猛交狂配 | 内射白嫩少妇超碰 | 国产亲子乱弄免费视频 | 国产精品a成v人在线播放 | 2020最新国产自产精品 | 人人澡人人透人人爽 | 人妻aⅴ无码一区二区三区 | 99久久久国产精品无码免费 | 国产综合久久久久鬼色 | 一个人看的视频www在线 | 日本一卡2卡3卡四卡精品网站 | 久久精品成人欧美大片 | 日韩欧美成人免费观看 | 波多野结衣乳巨码无在线观看 | 精品国产国产综合精品 | 亚洲日本va中文字幕 | 亚洲人成网站在线播放942 | 樱花草在线社区www | av无码久久久久不卡免费网站 | 水蜜桃色314在线观看 | 亚洲一区二区三区香蕉 | 亚洲国产日韩a在线播放 | 亚洲中文字幕无码一久久区 | 在线播放无码字幕亚洲 | 精品无码一区二区三区爱欲 | 黑人巨大精品欧美一区二区 | 熟妇人妻中文av无码 | 国产亚洲精品久久久ai换 | 图片小说视频一区二区 | 成人无码视频在线观看网站 | 熟妇人妻无乱码中文字幕 | 影音先锋中文字幕无码 | 人人妻人人澡人人爽人人精品 | a在线亚洲男人的天堂 | 无码国产激情在线观看 | 精品一区二区三区波多野结衣 | 亚洲va中文字幕无码久久不卡 | 国产精品国产自线拍免费软件 | 久9re热视频这里只有精品 | 国产麻豆精品一区二区三区v视界 | 在线观看国产午夜福利片 | 久久精品国产一区二区三区肥胖 | 色欲av亚洲一区无码少妇 | 日本一卡2卡3卡四卡精品网站 | 亚洲小说图区综合在线 | 成熟妇人a片免费看网站 | 在教室伦流澡到高潮hnp视频 | 国产高清不卡无码视频 | 亚洲中文字幕无码中文字在线 | 国产精品自产拍在线观看 | 国产超碰人人爽人人做人人添 | 香蕉久久久久久av成人 | 高潮毛片无遮挡高清免费 | 偷窥村妇洗澡毛毛多 | 人人澡人摸人人添 | 久久国产精品萌白酱免费 | 欧美黑人巨大xxxxx | 亚洲精品一区二区三区婷婷月 | 欧美 亚洲 国产 另类 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 秋霞特色aa大片 | 老子影院午夜精品无码 | 日本www一道久久久免费榴莲 | 99er热精品视频 | 亚洲区欧美区综合区自拍区 | 日本熟妇人妻xxxxx人hd | 嫩b人妻精品一区二区三区 | 久久久www成人免费毛片 | 一个人免费观看的www视频 | 在线视频网站www色 | 清纯唯美经典一区二区 | 国内老熟妇对白xxxxhd | 国产偷抇久久精品a片69 | 国产精品-区区久久久狼 | 男人扒开女人内裤强吻桶进去 | 人人妻人人澡人人爽欧美精品 | 亚洲成av人在线观看网址 | 国产黄在线观看免费观看不卡 | 女人和拘做爰正片视频 | 亚洲日韩av片在线观看 | 国产成人无码av在线影院 | 在线亚洲高清揄拍自拍一品区 | 丰腴饱满的极品熟妇 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲小说春色综合另类 | 人妻有码中文字幕在线 | 成人无码视频免费播放 | 亚洲va中文字幕无码久久不卡 | 欧美日韩精品 | 牲欲强的熟妇农村老妇女视频 | 高清无码午夜福利视频 | 亚洲爆乳精品无码一区二区三区 | 国产精品亚洲lv粉色 | 青青青爽视频在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 熟女少妇人妻中文字幕 | 白嫩日本少妇做爰 | 综合人妻久久一区二区精品 | 成人性做爰aaa片免费看不忠 | 亚洲aⅴ无码成人网站国产app | 蜜臀av无码人妻精品 | 亚洲国产av美女网站 | 丝袜 中出 制服 人妻 美腿 | 人人爽人人澡人人高潮 | 国产精品理论片在线观看 | 亚洲国产高清在线观看视频 | 日本熟妇人妻xxxxx人hd | 精品日本一区二区三区在线观看 | 亚洲综合无码一区二区三区 | 午夜免费福利小电影 | 性啪啪chinese东北女人 | 粉嫩少妇内射浓精videos | 国内精品人妻无码久久久影院蜜桃 | 国内揄拍国内精品少妇国语 | 亚洲精品中文字幕乱码 | 国产精品美女久久久久av爽李琼 | 黑人粗大猛烈进出高潮视频 | 久久www免费人成人片 | 性欧美疯狂xxxxbbbb | 亚洲性无码av中文字幕 | 亚洲色无码一区二区三区 | 搡女人真爽免费视频大全 | 无码人妻精品一区二区三区不卡 | 亚洲大尺度无码无码专区 | 伊人久久婷婷五月综合97色 | 欧美精品无码一区二区三区 | 久久久久成人精品免费播放动漫 | 女人被男人爽到呻吟的视频 | 色婷婷香蕉在线一区二区 | 亚洲日韩一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 熟女少妇人妻中文字幕 | 欧美老熟妇乱xxxxx | 日本在线高清不卡免费播放 | 亚洲一区二区三区香蕉 | 国产精品亚洲五月天高清 | 内射白嫩少妇超碰 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲人成人无码网www国产 | 无码播放一区二区三区 | 国产精品国产三级国产专播 | 久久这里只有精品视频9 | 熟妇女人妻丰满少妇中文字幕 | 色综合久久久无码中文字幕 | 日韩 欧美 动漫 国产 制服 | 国产舌乚八伦偷品w中 | 日本一区二区三区免费高清 | 国产人妖乱国产精品人妖 | 亚洲精品国产精品乱码视色 | 中文字幕亚洲情99在线 | 亚洲国产欧美在线成人 | 清纯唯美经典一区二区 | 99精品久久毛片a片 | 又粗又大又硬毛片免费看 | 亚洲伊人久久精品影院 | 欧美熟妇另类久久久久久多毛 | 国产热a欧美热a在线视频 | 久久无码专区国产精品s | 久久熟妇人妻午夜寂寞影院 | 特黄特色大片免费播放器图片 | 又大又黄又粗又爽的免费视频 | 日韩精品乱码av一区二区 | 亚洲午夜无码久久 | 性色欲网站人妻丰满中文久久不卡 | 麻豆av传媒蜜桃天美传媒 | 大地资源中文第3页 | 国产综合在线观看 | 丰腴饱满的极品熟妇 | 狂野欧美性猛交免费视频 | 亚洲国产高清在线观看视频 | 天天摸天天碰天天添 | 精品人人妻人人澡人人爽人人 | 亚洲色大成网站www | 国产成人精品三级麻豆 | 精品久久久久久人妻无码中文字幕 | 国产精品久久久久影院嫩草 | 亚洲人亚洲人成电影网站色 | 东京无码熟妇人妻av在线网址 | 久久99精品国产麻豆 | 好男人社区资源 | 亚洲精品美女久久久久久久 | 国产精品办公室沙发 | 曰韩无码二三区中文字幕 | 亚洲中文无码av永久不收费 | 日韩成人一区二区三区在线观看 | 中文字幕无码乱人伦 | 亚洲日韩中文字幕在线播放 | 美女扒开屁股让男人桶 | 2019nv天堂香蕉在线观看 | 国内综合精品午夜久久资源 | 色综合久久久久综合一本到桃花网 | 无套内谢老熟女 | 熟妇人妻无码xxx视频 | 婷婷色婷婷开心五月四房播播 | 老子影院午夜伦不卡 | 67194成是人免费无码 | 奇米影视7777久久精品 | 亚洲国产精品无码久久久久高潮 | 成人亚洲精品久久久久软件 | 图片区 小说区 区 亚洲五月 | 又大又硬又黄的免费视频 | 久久久亚洲欧洲日产国码αv | 黑人玩弄人妻中文在线 | 在线欧美精品一区二区三区 | 午夜成人1000部免费视频 | 性欧美大战久久久久久久 | 日韩精品无码免费一区二区三区 | 5858s亚洲色大成网站www | 亚洲精品综合一区二区三区在线 | 兔费看少妇性l交大片免费 | 人妻夜夜爽天天爽三区 | 亚洲熟女一区二区三区 | 精品国产一区二区三区av 性色 | 国产精品亚洲综合色区韩国 | 影音先锋中文字幕无码 | 国产成人精品一区二区在线小狼 | 中文字幕无码av波多野吉衣 | 激情亚洲一区国产精品 | 无码人妻丰满熟妇区五十路百度 | 国产情侣作爱视频免费观看 | 人妻少妇精品无码专区动漫 | 图片小说视频一区二区 | www成人国产高清内射 | 永久免费精品精品永久-夜色 | 欧美老妇交乱视频在线观看 | 国产精品无码久久av | 久久国产精品_国产精品 | 十八禁视频网站在线观看 | 久久久国产精品无码免费专区 | 国产在线精品一区二区三区直播 | 四虎影视成人永久免费观看视频 | 女人被爽到呻吟gif动态图视看 | 精品人妻中文字幕有码在线 | 国产人妻精品一区二区三区不卡 | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产精华液网站w | 18禁黄网站男男禁片免费观看 | 一二三四社区在线中文视频 | 精品国产精品久久一区免费式 | 亚洲国产成人a精品不卡在线 | 亚洲 欧美 激情 小说 另类 | 天天综合网天天综合色 | 精品久久综合1区2区3区激情 | 青青青手机频在线观看 | 蜜臀av在线播放 久久综合激激的五月天 | 天堂无码人妻精品一区二区三区 | 免费无码一区二区三区蜜桃大 | 一本色道婷婷久久欧美 | 国产精华av午夜在线观看 | 成人无码视频免费播放 | 免费视频欧美无人区码 | 无码人妻出轨黑人中文字幕 | 午夜无码人妻av大片色欲 | 欧美人妻一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 日本大乳高潮视频在线观看 | 在线观看国产午夜福利片 | 国产午夜福利亚洲第一 | 亚洲熟熟妇xxxx | 精品aⅴ一区二区三区 | 国产av无码专区亚洲a∨毛片 | 大乳丰满人妻中文字幕日本 | 亚洲理论电影在线观看 | 亚洲色成人中文字幕网站 | 日本大乳高潮视频在线观看 | 又大又硬又爽免费视频 | v一区无码内射国产 | 久久99精品国产麻豆 | 国产成人精品无码播放 | 国产亚洲欧美日韩亚洲中文色 | 高潮毛片无遮挡高清免费视频 | 精品久久久久久人妻无码中文字幕 | 国产香蕉尹人视频在线 | 香港三级日本三级妇三级 | 亚洲熟女一区二区三区 | 最近免费中文字幕中文高清百度 | 中文字幕无码av波多野吉衣 | 欧美刺激性大交 | 久久精品女人的天堂av | 久久综合狠狠综合久久综合88 | 中文字幕 人妻熟女 | 大肉大捧一进一出好爽视频 | 中文字幕 人妻熟女 | 国产在线精品一区二区三区直播 | 亚洲熟妇色xxxxx欧美老妇y | 欧美猛少妇色xxxxx | 免费播放一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 欧美精品在线观看 | 国产特级毛片aaaaaa高潮流水 | 色综合久久久无码网中文 | 亚洲中文无码av永久不收费 | 精品日本一区二区三区在线观看 | 好爽又高潮了毛片免费下载 | 在线欧美精品一区二区三区 | 欧洲vodafone精品性 | 强奷人妻日本中文字幕 | 未满成年国产在线观看 | 亚洲成色www久久网站 | 青草视频在线播放 | 亚洲熟女一区二区三区 | 国产在热线精品视频 | 最新国产乱人伦偷精品免费网站 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 日韩精品无码免费一区二区三区 | 国产人妖乱国产精品人妖 | 男人的天堂2018无码 | 无码人妻av免费一区二区三区 | 国色天香社区在线视频 | 麻花豆传媒剧国产免费mv在线 | 综合人妻久久一区二区精品 | 强辱丰满人妻hd中文字幕 | 久久久中文字幕日本无吗 | 国产精品内射视频免费 | 亚洲va中文字幕无码久久不卡 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成人免费视频在线观看 | 国产精品毛片一区二区 | 狂野欧美性猛xxxx乱大交 | 国产午夜福利100集发布 | 精品一区二区三区波多野结衣 | 久久99国产综合精品 | 中文字幕乱码亚洲无线三区 | 国产激情综合五月久久 | 丝袜人妻一区二区三区 | 天堂а√在线中文在线 | 正在播放老肥熟妇露脸 | 动漫av网站免费观看 | 在线精品国产一区二区三区 | 国产精品久久久久影院嫩草 | 人人妻人人澡人人爽欧美一区九九 | 清纯唯美经典一区二区 | 国产va免费精品观看 | 99久久无码一区人妻 | 亚洲s色大片在线观看 | 国产精品久久久久无码av色戒 | 久久 国产 尿 小便 嘘嘘 | 久久久www成人免费毛片 | 欧美日韩视频无码一区二区三 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久久久影院 | 亚洲中文字幕乱码av波多ji | 日本肉体xxxx裸交 | 日韩人妻无码一区二区三区久久99 | 激情国产av做激情国产爱 | 亚洲成av人片天堂网无码】 | 中文字幕无码av波多野吉衣 | 精品夜夜澡人妻无码av蜜桃 | а√资源新版在线天堂 | 国产免费久久久久久无码 | 精品久久久无码人妻字幂 | 欧美丰满少妇xxxx性 | 色综合久久久无码中文字幕 | √天堂资源地址中文在线 | 亚洲国产精华液网站w | 色综合久久久无码网中文 | 国语自产偷拍精品视频偷 | 纯爱无遮挡h肉动漫在线播放 | 色欲综合久久中文字幕网 | 日本精品人妻无码免费大全 | 又大又硬又黄的免费视频 | 日韩精品无码一区二区中文字幕 | 妺妺窝人体色www在线小说 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产成人精品必看 | 日本护士xxxxhd少妇 | 正在播放老肥熟妇露脸 | 成人试看120秒体验区 | 婷婷五月综合缴情在线视频 | a片免费视频在线观看 | 波多野结衣 黑人 | 女人和拘做爰正片视频 | 国产精品久久国产精品99 | 野外少妇愉情中文字幕 | 精品国产福利一区二区 | 欧美zoozzooz性欧美 | 牲欲强的熟妇农村老妇女 | 成熟妇人a片免费看网站 | 国产真实伦对白全集 | 亚洲欧美色中文字幕在线 | 漂亮人妻洗澡被公强 日日躁 | 亚洲国产精品无码久久久久高潮 | 国产高清不卡无码视频 | 青草青草久热国产精品 | 国语精品一区二区三区 | 波多野结衣乳巨码无在线观看 | 亚洲 欧美 激情 小说 另类 | www国产亚洲精品久久久日本 | 无码福利日韩神码福利片 | 亚洲娇小与黑人巨大交 | 久久99精品久久久久婷婷 | 妺妺窝人体色www在线小说 | 一本精品99久久精品77 | 人人妻人人澡人人爽欧美一区九九 | 久久 国产 尿 小便 嘘嘘 | 中文字幕av伊人av无码av | 任你躁在线精品免费 | 日本精品人妻无码免费大全 | a片在线免费观看 | 一本加勒比波多野结衣 | 久久久久亚洲精品中文字幕 | 亚洲日韩一区二区 | 内射老妇bbwx0c0ck | 中文字幕人妻无码一区二区三区 | 蜜桃视频插满18在线观看 | 成人影院yy111111在线观看 | 黑森林福利视频导航 | 波多野结衣av在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 图片小说视频一区二区 | 一二三四社区在线中文视频 | 国产精品美女久久久网av | 大肉大捧一进一出好爽视频 | 久激情内射婷内射蜜桃人妖 | 欧美野外疯狂做受xxxx高潮 | 最新版天堂资源中文官网 | 蜜臀av在线播放 久久综合激激的五月天 | 精品久久久久久人妻无码中文字幕 | 一本精品99久久精品77 | 欧美 日韩 人妻 高清 中文 | 丰满人妻翻云覆雨呻吟视频 | 午夜精品一区二区三区在线观看 | 亚洲国产精品美女久久久久 | 国产激情精品一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 老熟妇乱子伦牲交视频 | 无码精品人妻一区二区三区av | 国产香蕉尹人视频在线 | 国产成人无码av一区二区 | 国产明星裸体无码xxxx视频 | 丰满人妻精品国产99aⅴ | 婷婷丁香五月天综合东京热 | 国内精品人妻无码久久久影院 | 色欲av亚洲一区无码少妇 | 性色欲情网站iwww九文堂 | 色综合久久中文娱乐网 | 日韩精品a片一区二区三区妖精 | 小sao货水好多真紧h无码视频 | 亚洲狠狠婷婷综合久久 | 中文字幕无线码免费人妻 | 久久亚洲a片com人成 | 国产免费久久久久久无码 | 色综合久久中文娱乐网 | 久久久久成人精品免费播放动漫 | 精品成人av一区二区三区 | 亚洲一区av无码专区在线观看 | 亚洲精品国产品国语在线观看 | 天天拍夜夜添久久精品大 | 亚洲人成网站色7799 | 国产激情艳情在线看视频 | 天天摸天天透天天添 | 无码人妻精品一区二区三区下载 | 久久久精品国产sm最大网站 | 成年美女黄网站色大免费全看 | 奇米影视7777久久精品 | 亚洲国产精华液网站w | 波多野结衣 黑人 | 3d动漫精品啪啪一区二区中 | 国产香蕉尹人综合在线观看 | 亚洲最大成人网站 | 1000部夫妻午夜免费 | 日本熟妇浓毛 | 偷窥村妇洗澡毛毛多 | 日韩 欧美 动漫 国产 制服 | 久久视频在线观看精品 | 国产精品人人爽人人做我的可爱 | 麻豆人妻少妇精品无码专区 | 欧美野外疯狂做受xxxx高潮 | 伊在人天堂亚洲香蕉精品区 | 波多野结衣av一区二区全免费观看 | 少妇性l交大片 | 亚洲男女内射在线播放 | 久久精品无码一区二区三区 | 美女张开腿让人桶 | 国产超级va在线观看视频 | 欧美zoozzooz性欧美 | 少妇一晚三次一区二区三区 | 亚洲国精产品一二二线 | 亚洲欧洲中文日韩av乱码 | 亚洲成色www久久网站 | 99国产精品白浆在线观看免费 | 亚洲精品无码人妻无码 | 国产精品美女久久久网av | 亚洲国产午夜精品理论片 | 色婷婷综合激情综在线播放 | 无码国模国产在线观看 | 377p欧洲日本亚洲大胆 | 国产免费久久精品国产传媒 | 国产精品二区一区二区aⅴ污介绍 | 国产午夜福利100集发布 | 精品国精品国产自在久国产87 | 在线观看欧美一区二区三区 | 色 综合 欧美 亚洲 国产 | 国产精品美女久久久久av爽李琼 | 日本免费一区二区三区最新 | 97久久国产亚洲精品超碰热 | 国产性生交xxxxx无码 | 综合网日日天干夜夜久久 | 精品久久久无码人妻字幂 | 性色欲网站人妻丰满中文久久不卡 | 大地资源中文第3页 | 亚洲成av人片天堂网无码】 | 亚洲第一网站男人都懂 | 亚洲の无码国产の无码影院 | 图片区 小说区 区 亚洲五月 | 少妇人妻偷人精品无码视频 | 人妻aⅴ无码一区二区三区 | 正在播放东北夫妻内射 | 少妇邻居内射在线 | 三级4级全黄60分钟 | 2020久久超碰国产精品最新 | 熟女少妇人妻中文字幕 | 国产精品成人av在线观看 | 无码av最新清无码专区吞精 | av无码久久久久不卡免费网站 | av无码电影一区二区三区 | 久久精品国产99久久6动漫 | 国产精品va在线播放 | 中文字幕中文有码在线 | 久久精品人人做人人综合 | √天堂资源地址中文在线 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品国产品国语在线观看 | 国产精品久久久一区二区三区 | 亚洲精品中文字幕久久久久 | 国产在线一区二区三区四区五区 | 特大黑人娇小亚洲女 | 国产特级毛片aaaaaa高潮流水 | 亚洲国产成人av在线观看 | 2020最新国产自产精品 | 精品国产国产综合精品 | 55夜色66夜色国产精品视频 | 天堂在线观看www | 中文字幕乱码人妻无码久久 | 久久亚洲精品成人无码 | 中文字幕 人妻熟女 | 少妇被粗大的猛进出69影院 | 国产麻豆精品精东影业av网站 | 久久国产精品_国产精品 | 亚洲国产精品毛片av不卡在线 | 永久黄网站色视频免费直播 | 国产黄在线观看免费观看不卡 | 一本无码人妻在中文字幕免费 | 久久久久久久女国产乱让韩 | 国产无av码在线观看 | 四虎影视成人永久免费观看视频 | 成人欧美一区二区三区 | 大肉大捧一进一出视频出来呀 | 嫩b人妻精品一区二区三区 | 亚洲精品久久久久中文第一幕 | 一本精品99久久精品77 | 欧美激情一区二区三区成人 | 丝袜足控一区二区三区 | 中文字幕人妻无码一区二区三区 | 男人的天堂2018无码 | 亚洲毛片av日韩av无码 | 丰满人妻一区二区三区免费视频 | 久久久成人毛片无码 | 无码国产色欲xxxxx视频 | 男女超爽视频免费播放 | 男女猛烈xx00免费视频试看 | 中国女人内谢69xxxx | 最新国产乱人伦偷精品免费网站 | 欧美亚洲日韩国产人成在线播放 | 久久综合九色综合97网 | 四虎国产精品一区二区 | 2019午夜福利不卡片在线 | 给我免费的视频在线观看 | 妺妺窝人体色www在线小说 | 亚洲欧美精品伊人久久 | 亚洲欧美精品aaaaaa片 | 久久无码中文字幕免费影院蜜桃 | 成人av无码一区二区三区 | 亚洲欧美精品伊人久久 | 两性色午夜免费视频 | 精品无码国产一区二区三区av | 国产精品久久久久久久影院 | 性色av无码免费一区二区三区 | 女人被男人躁得好爽免费视频 | 理论片87福利理论电影 | 精品成人av一区二区三区 | 国产熟女一区二区三区四区五区 | 久久国语露脸国产精品电影 | 亚洲区小说区激情区图片区 | 超碰97人人做人人爱少妇 | 午夜嘿嘿嘿影院 | av无码久久久久不卡免费网站 | 国产内射爽爽大片视频社区在线 | 国产av剧情md精品麻豆 | 精品久久综合1区2区3区激情 | 国产精品人妻一区二区三区四 | 国产97人人超碰caoprom | 色窝窝无码一区二区三区色欲 | 蜜桃av抽搐高潮一区二区 | 成年美女黄网站色大免费全看 | 熟妇人妻无乱码中文字幕 | 伊人色综合久久天天小片 | 国产一区二区不卡老阿姨 | 成人性做爰aaa片免费看 | 国产高潮视频在线观看 | 亚洲一区二区三区播放 | 鲁一鲁av2019在线 | 久久国产精品_国产精品 | 久精品国产欧美亚洲色aⅴ大片 | 妺妺窝人体色www婷婷 | 久久亚洲精品中文字幕无男同 | 久久99精品久久久久婷婷 | 欧美丰满熟妇xxxx | 欧美国产日产一区二区 | 在线欧美精品一区二区三区 | 在线a亚洲视频播放在线观看 | 在线 国产 欧美 亚洲 天堂 | 正在播放老肥熟妇露脸 | 国产深夜福利视频在线 | 麻豆av传媒蜜桃天美传媒 | 图片区 小说区 区 亚洲五月 | 国产精品鲁鲁鲁 | 蜜桃av抽搐高潮一区二区 | 狠狠噜狠狠狠狠丁香五月 | 高潮毛片无遮挡高清免费视频 | 国内揄拍国内精品少妇国语 | 久久久久久久人妻无码中文字幕爆 | 天天摸天天碰天天添 | а√天堂www在线天堂小说 | 日本免费一区二区三区最新 | 欧美第一黄网免费网站 | 日韩av无码一区二区三区 | 色狠狠av一区二区三区 | 综合激情五月综合激情五月激情1 | 中文字幕人成乱码熟女app | 欧美丰满熟妇xxxx性ppx人交 | 国产成人人人97超碰超爽8 | 丰满少妇高潮惨叫视频 | 狠狠亚洲超碰狼人久久 | 给我免费的视频在线观看 | 一本无码人妻在中文字幕免费 | 鲁大师影院在线观看 | www一区二区www免费 | 麻豆精品国产精华精华液好用吗 | 在线a亚洲视频播放在线观看 | 天天av天天av天天透 | 亚洲日韩中文字幕在线播放 | 樱花草在线播放免费中文 | 中国大陆精品视频xxxx | 亚洲综合无码久久精品综合 | 国产精品久久久午夜夜伦鲁鲁 | 日日摸日日碰夜夜爽av | 免费国产黄网站在线观看 | 亚洲国产精品一区二区第一页 | 激情综合激情五月俺也去 | av在线亚洲欧洲日产一区二区 | 久热国产vs视频在线观看 | 精品少妇爆乳无码av无码专区 | 99久久人妻精品免费一区 | 又大又黄又粗又爽的免费视频 | 亚洲成色在线综合网站 | 国产另类ts人妖一区二区 | 国产成人一区二区三区别 | 国产三级久久久精品麻豆三级 | 中文字幕人妻无码一区二区三区 | 日本又色又爽又黄的a片18禁 | 狠狠cao日日穞夜夜穞av | 99麻豆久久久国产精品免费 | 一本精品99久久精品77 | 人妻无码αv中文字幕久久琪琪布 | 最近中文2019字幕第二页 | 欧美日韩精品 | 国产成人综合色在线观看网站 | 日韩欧美成人免费观看 | 久久久久久久久蜜桃 | 成人片黄网站色大片免费观看 | 国产又粗又硬又大爽黄老大爷视 | 日本精品久久久久中文字幕 | 欧美日韩视频无码一区二区三 | 日本精品人妻无码77777 天堂一区人妻无码 | 97色伦图片97综合影院 | 一本久道久久综合狠狠爱 | 无码纯肉视频在线观看 | 无码精品国产va在线观看dvd | 日韩无码专区 | 国产精品久久久久久无码 | 99er热精品视频 | 日本xxxx色视频在线观看免费 | 日韩欧美中文字幕公布 | 人妻少妇精品久久 | 久久国产精品萌白酱免费 | 国产欧美熟妇另类久久久 | 黑人巨大精品欧美黑寡妇 | 久久视频在线观看精品 | 熟女少妇在线视频播放 | 牲交欧美兽交欧美 | 亚洲人成网站免费播放 | 国内综合精品午夜久久资源 | 5858s亚洲色大成网站www | 国产激情精品一区二区三区 | 亚洲中文字幕在线观看 | 激情内射亚州一区二区三区爱妻 | 高清无码午夜福利视频 | 3d动漫精品啪啪一区二区中 | 亚洲男人av天堂午夜在 | 性做久久久久久久免费看 | 88国产精品欧美一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 精品熟女少妇av免费观看 | 色婷婷综合中文久久一本 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久www成人免费毛片 | 青青草原综合久久大伊人精品 | 午夜无码人妻av大片色欲 | 亚洲色欲色欲欲www在线 | 亚洲日韩av一区二区三区四区 | 少妇高潮一区二区三区99 | 国产亚洲日韩欧美另类第八页 | 精品无码av一区二区三区 | 亚洲一区av无码专区在线观看 | 欧美激情一区二区三区成人 | 亚洲色在线无码国产精品不卡 | 成人免费视频视频在线观看 免费 | 激情综合激情五月俺也去 | 欧美 日韩 亚洲 在线 | 天堂一区人妻无码 | 无码精品国产va在线观看dvd | 人妻少妇被猛烈进入中文字幕 | 免费人成网站视频在线观看 | 中文字幕中文有码在线 | 国产偷国产偷精品高清尤物 | 国产精品福利视频导航 | 九九久久精品国产免费看小说 | 无码人妻少妇伦在线电影 | 在线精品亚洲一区二区 | 欧美亚洲国产一区二区三区 | 老熟女重囗味hdxx69 | 性生交大片免费看女人按摩摩 | 日本精品少妇一区二区三区 | 亚洲s码欧洲m码国产av | 国产成人无码av一区二区 | 国产一区二区三区影院 | 精品无码一区二区三区的天堂 | 永久免费精品精品永久-夜色 | 97精品国产97久久久久久免费 | 婷婷综合久久中文字幕蜜桃三电影 | 九九热爱视频精品 | 国产成人无码av一区二区 | 67194成是人免费无码 | 国产成人精品视频ⅴa片软件竹菊 | 国产欧美熟妇另类久久久 | 午夜无码人妻av大片色欲 | 成人毛片一区二区 | 亚洲第一无码av无码专区 | 性欧美牲交在线视频 | 色 综合 欧美 亚洲 国产 | 亚洲va欧美va天堂v国产综合 | 欧美日本免费一区二区三区 | 国产又爽又黄又刺激的视频 | 真人与拘做受免费视频一 | 无码人妻出轨黑人中文字幕 | 色老头在线一区二区三区 | 精品偷自拍另类在线观看 | 精品无码av一区二区三区 | 久久国语露脸国产精品电影 | 秋霞成人午夜鲁丝一区二区三区 | 熟女俱乐部五十路六十路av | 日韩人妻无码一区二区三区久久99 | 亚洲gv猛男gv无码男同 | 天天av天天av天天透 | 国产精品永久免费视频 | 内射后入在线观看一区 | 日韩无码专区 | 未满小14洗澡无码视频网站 | 久久婷婷五月综合色国产香蕉 | 国内综合精品午夜久久资源 | 六十路熟妇乱子伦 | 欧美 丝袜 自拍 制服 另类 | 色情久久久av熟女人妻网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 强辱丰满人妻hd中文字幕 | 男人的天堂av网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 乌克兰少妇性做爰 | 欧美国产日韩亚洲中文 | 色婷婷综合中文久久一本 | 亚洲熟悉妇女xxx妇女av | 西西人体www44rt大胆高清 | 成熟人妻av无码专区 | 又粗又大又硬毛片免费看 | 纯爱无遮挡h肉动漫在线播放 | 欧美喷潮久久久xxxxx | 国产乱子伦视频在线播放 | 波多野结衣高清一区二区三区 | 青春草在线视频免费观看 | 色老头在线一区二区三区 | 久久久久国色av免费观看性色 | 又紧又大又爽精品一区二区 | 亚洲综合无码一区二区三区 | 男女爱爱好爽视频免费看 | 国产精品99爱免费视频 | 亚洲精品国产a久久久久久 | 国产乱人伦av在线无码 | 欧美黑人乱大交 | 成人精品一区二区三区中文字幕 | 午夜福利一区二区三区在线观看 | 日本乱人伦片中文三区 | 精品久久久无码中文字幕 | 久久久久成人精品免费播放动漫 | 黑人巨大精品欧美一区二区 | 国产女主播喷水视频在线观看 | 国产精品丝袜黑色高跟鞋 | 国产精品高潮呻吟av久久4虎 | 玩弄中年熟妇正在播放 | 十八禁视频网站在线观看 | 欧美日韩一区二区综合 |