日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

python

Python爬虫 解析库的使用

發布時間:2024/2/28 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫 解析库的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

已寫章節

第一章 網絡爬蟲入門
第二章 基本庫的使用
第三章 解析庫的使用
第四章 數據存儲
第五章 動態網頁的抓取

文章目錄

      • 已寫章節
  • 第三章 解析庫的使用
    • 3.1BeautifulSoup
      • 3.1.1 BeautifulSoup的安裝
      • 3.1.2 BeautifulSoup庫的理解
      • 3.1.3 解析器
      • 3.1.4 BeautifulSoup的基本使用
        • 3.1.4.1 使用soup.\來獲取指定的標簽
        • 3.1.4.2 獲取標簽的屬性
        • 3.1.4.3 標簽樹的遍歷
        • 3.1.4.4 使用BeautifulSoup提供的方法來選擇標簽
          • find_all()方法
          • find()方法
          • prettify()方法
          • 其他查詢方法:
        • 3.1.4.6 使用Lambda表達式
        • 3.1.4.5 css選擇器
          • 嵌套選擇
          • 獲取屬性
          • 獲取文本
      • 3.1.5 使用BeautifulSoup爬取qq音樂的首發音樂
    • 3.2 Xpath(重點)
      • 3.2.1 Xpath介紹
      • 3.2.2 Xpath的常用規則
      • 3.2.3 Xpath的使用
        • 3.2.3.1 安裝lxml
        • 3.2.3.2 使用Xpath
        • 3.2.3.3 xpath使用技巧
      • 3.2.4 使用Xpath爬取窮游網的中國熱門城市
    • 3.3 pyquery(了解)
      • 3.3.1 pyquery的安裝
      • 3.3.2 初始化
      • 3.3.3 pyquery的使用


第三章 解析庫的使用



3.1BeautifulSoup



BeautifulSoup也被稱作為”美味湯“,BeautifulSoup提供了一些簡單的、Python式的函數來處理導航、搜索、修改和分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據。BeautifulSoup已成為和lxml、html6lib一樣出色的Python解釋器,為用戶靈活的提供不同的解析策略或強勁的速度。

作者提示:當你學習了Xpath后,你會發現BeautifulSoup是非常不好用的,并且學了Xpath之后,基本不用BeautifulSoup了。但是,我想說的是,學習BeautifulSoup會加強你對標簽樹、子標簽、父標簽、后代標簽以及標簽的結構的理解,而這些都是學習Xpath的基礎,這也是為什么很多人將BeautifulSoup作為自己學習Python網絡爬蟲的第一個解析庫。

Beautiful Soup庫是解析、遍歷、維護“標簽樹"的功能庫。

BeautifulSoup文檔



3.1.1 BeautifulSoup的安裝


在cmd命令行中輸入以下命令來使用pip安裝BeautifulSoup庫:

pip install beautifulsoup4


Beautiful Soup庫,也叫beautifulsoup4或bs4,約定導入方式如下:

from bs4 import BeautifulSoup # 或: import bs4

在Python文件中使用上面的代碼導入BeautifulSoup庫,如果沒有報錯,說明你已經成功安裝了BeautifulSoup。


3.1.2 BeautifulSoup庫的理解


BeautifulSoup是將HTML代碼當做一個便簽樹來處理,BeautifulSoup對應一個HTML/XML文檔的全部內容 。其中的每一個標簽的結構如下:

基本元素說明
Tag標簽,最基本的信息組織單元,分別用<>和</>標明開頭和結尾
Name標簽名,<p>...</p>的名字是’p’,格式:<tag>.name
Attributes標簽屬性,字典形式組織,格式:<tag>.attrs
NavigableString標簽內的非屬性字符串,<>...</>中的字符串,格式:<tag>.string
Comment標簽內字符串的注釋部分,一種特殊的comment類型

3.1.3 解析器


Beautiful Soup在解析時需要依賴解析器:

soup = BeautifuSoup('<html>data</html>','html.parser') 解析器使用方法條件
bs4的HTML解析器BeautifulSoup(mk,‘html.parser’)安裝bs4庫
lxml的解析器BeautifulSoup(mk,‘lxml’)pip install lxml
lxml的XML解析器BeautifulSoup(mk,‘xml’)pip install lxml
html5lib的解析器BeautifulSoup(mk,'html5lib‘)pip install html5lib

3.1.4 BeautifulSoup的基本使用


在上面介紹了Tag(標簽),它是最基本的信息組織單元,分別用<>和</>標明開頭和結尾,下面介紹BeautifulSoup的基本使用。


3.1.4.1 使用soup.<tag>來獲取指定的標簽

from bs4 import BeautifulSoup# 使用soup.<tagname>來獲取指定的標簽 text = ''' <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="link3">Tillie</a>; and they lived at the bottom of a well.</p><p class="story">...</p><f><!--This is a comment--></f><c>This is not a comment</c></body> </html> '''soup = BeautifulSoup(text, "html.parser") print(soup.a)

通過soup.a來獲取HTML中的a標簽,如果結果有多個,取第一個。下面是運行結果:

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

注意:任何存在于HTML語法中的標簽都可以使用soup.<tag>訪問獲得,當HTML中存在多個相同<tag>標簽時,soup.<tag>返回第一個。


3.1.4.2 獲取標簽的屬性

from bs4 import BeautifulSoup# BeautifulSoup中獲取標簽的屬性 text = ''' <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="link3">Tillie</a>; and they lived at the bottom of a well.</p><p class="story">...</p><f><!--This is a comment--></f><c>This is not a comment</c></body> </html> '''soup = BeautifulSoup(text, "html.parser")print("a標簽的名字是:", soup.a.name)print(type(soup.a.attrs)) print("a標簽的屬性為:", soup.a.attrs)print("a標簽的class屬性是", soup.a.attrs['class'])print(type(soup.a.string)) print("a標簽中的非屬性字符串為:", soup.a.string)print(type(soup.f.string)) print("f標簽中的注釋為:", soup.f.string)

運行結果:

a標簽的名字是: a <class 'dict'> a標簽的屬性為: {'href': 'http://example.com/elsie', 'class': ['sister'], 'id': 'link1'} a標簽的class屬性是 ['sister'] <class 'bs4.element.NavigableString'> a標簽中的非屬性字符串為: Elsie <class 'bs4.element.Comment'> f標簽中的注釋為: This is a comment

3.1.4.3 標簽樹的遍歷


標簽樹的下行遍歷

屬性說明
.contents子節點的列表,將<tag>的所有兒子節點存入列表
.children子節點的迭代類型,與.contents類似,用于循環遍歷兒子節點
.descendants子孫節點的迭代類型,包含所有子孫節點,用于循環遍歷
from bs4 import BeautifulSoup# 標簽樹的下行遍歷 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <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><p class="story">...</p>aaa</a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser')print(len(soup.body.contents)) print(soup.body.contents)print("-"*50) for i, child in enumerate(soup.body.children):print(i, child)print("-"*50) for i, descendant in enumerate(soup.body.descendants):print(i, descendant)

運行結果:

9 ['\n', <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, '\n', <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, '\n', <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>, '\n', <a><p class="story">...</p>aaa</a>, '\n'] -------------------------------------------------- 0 1 <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> 2 3 <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 4 5 <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> 6 7 <a><p class="story">...</p>aaa</a> 8 -------------------------------------------------- 0 1 <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> 2 Elsie 3 4 <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 5 Lacie 6 7 <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> 8 Tillie 9 10 <a><p class="story">...</p>aaa</a> 11 <p class="story">...</p> 12 ... 13 aaa 14

注意:descendants會遞歸查詢所有子節點,得到所有的子孫節點


標簽的上行遍歷

屬性說明
.parent節點的父親標簽
.parents節點的先輩標簽的迭代類型,用于循環遍歷先輩節點
from bs4 import BeautifulSoup# 標簽樹的上行遍歷 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <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><p class="story">...</p>aaa</a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser')print(soup.p.parent)print("-"*50) for i, parent in enumerate(soup.p.parents):print(i, parent)

運行結果:

<a><p class="story">...</p>aaa</a> -------------------------------------------------- 0 <a><p class="story">...</p>aaa</a> 1 <body> <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> <a><p class="story">...</p>aaa</a> </body> 2 <html><head><title>The Dormouse's story</title></head> <body> <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> <a><p class="story">...</p>aaa</a> </body> </html> 3 <html><head><title>The Dormouse's story</title></head> <body> <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> <a><p class="story">...</p>aaa</a> </body> </html>

標簽的平行遍歷

屬性說明
.next_sibling返回按照HTML文本順序的下一個平行節點標簽
.previous_sibling返回按照HTML文本順序的上一個平行節點標簽
.next_siblings迭代類型,返回按照HTML文本順序的后續所有平行節點標簽
.privious_siblings迭代類型,返回按照HTML文本順序的前續所有平行節點標簽
from bs4 import BeautifulSoup# 標簽樹的平行遍歷 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a></a> <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> <p>pp</p> <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><p class="story">...</p>aaa</a> </body> </html> '''text = text.replace('\n', '') # 去除換行符的干擾 soup = BeautifulSoup(text, 'html.parser')print(soup.p.next_sibling) print("-"*50)print(soup.p.previous_sibling) print("-"*50)for i, previous_sibling in enumerate(soup.p.previous_siblings):print(i, previous_sibling) print("-"*50)for i, next_sibling in enumerate(soup.p.next_siblings):print(i, next_sibling)

運行結果如下:

<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> -------------------------------------------------- <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> -------------------------------------------------- 0 <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> 1 <a></a> -------------------------------------------------- 0 <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 1 <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> 2 <a><p class="story">...</p>aaa</a>

3.1.4.4 使用BeautifulSoup提供的方法來選擇標簽


find_all()方法

查詢所有符合條件的元素,給它傳入一些屬性或文本,就可以得到符合條件的元素。

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


  • name參數:篩選出所有符合標簽名條件的標簽,可以是一個標簽名,也可以是一個Python字典或列表封裝的若干個標簽名
from bs4 import BeautifulSoup# soup.find_all()方法中篩選指定標簽名的標簽 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <p class="title"></p> <a href="http://example.com" class="sister">Elsie</a> <a href="http://example.com" class="sister">Tillie</a> <p class="story">...</p> </body> </html> '''text = text.replace('\n', '') soup = BeautifulSoup(text, 'html.parser')print(soup.find_all('a')) # 找出所有的a標簽print(soup.find_all('p')) # 找出所有的p標簽print(soup.find_all(['p', 'title'])) # 找出所有的a標簽和title標簽

運行結果:

[<a class="sister" href="http://example.com">Elsie</a>, <a class="sister" href="http://example.com">Tillie</a>] [<p class="title"></p>, <p class="story">...</p>] [<title>The Dormouse's story</title>, <p class="title"></p>, <p class="story">...</p>]
  • attrs參數:根據標簽的屬性來篩選滿足條件的標簽,用字典封裝一個標簽的若干個屬性和對應的屬性值
from bs4 import BeautifulSoup# soup.find_all()中根據標簽屬性來篩選標簽 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <p class="title"></p> <a href="link1" class="b">Elsie</a> <a href="link1" class="a">Tillie</a> <a href="link1" class="c">df</a> <p class="story">...</p> </body> </html> '''text = text.replace('\n', '') soup = BeautifulSoup(text, 'html.parser')print(soup.find_all('a', {'href': 'link1'})) # 找出所有的href屬性為link1的a標簽 print('-'*50)print(soup.find_all('a', {'href': 'link1', 'class': 'a'})) # 找出所有的href屬性為link1且class屬性為a的p標簽 print('-'*50)print(soup.find_all('a', {'class': ['a', 'b']})) # 找出說有的class屬性為a或b的a標簽 print('-'*50)print(soup.find_all(['p', 'title'])) # 找出所有的p標簽和title標簽

運行結果:

[<a class="b" href="link1">Elsie</a>, <a class="a" href="link1">Tillie</a>, <a class="c" href="link1">df</a>] -------------------------------------------------- [<a class="a" href="link1">Tillie</a>] -------------------------------------------------- [<a class="b" href="link1">Elsie</a>, <a class="a" href="link1">Tillie</a>] -------------------------------------------------- [<title>The Dormouse's story</title>, <p class="title"></p>, <p class="story">...</p>]
  • recursive參數:布爾變量,默認為True。它決定了要抓取HTML文檔標簽結構里的多少層信息。如果設置為True,find_all()方法就會根據你的要求去查找標簽參數的所有子標簽,以及子標簽的子標簽。如果設置為False,find_all()方法就只查找文檔的一級標簽。recursive一般不需要設置,除非你真正了解自己需要哪些信息,而且抓取的速度非常重要,那時你就可以設置遞歸參數。

  • text參數:用標簽的文本內容去匹配
from bs4 import BeautifulSoup import re# soup.find_all()中使用文本來篩選標簽 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <p class="title"></p> <a href="link1" class="b">Elsie</a> <a href="link1" class="a">Tillie</a> <a href="link1" class="c">df</a> <p class="story">...</p> <b>dfd</b> </body> </html> '''text = text.replace('\n', '') soup = BeautifulSoup(text, 'html.parser')print(soup.find_all(text=re.compile('.*df.*'))) # 找出所有標簽文本中包含df的文本,返回結果為字符串列表

運行結果:

['df', 'dfd']
  • limit參數:結果數目限制參數,它限制了查找結果標簽的數目,它只適用于find_all()方法,find()方法其實等價于find_all()方法的limit為1的時候。
from bs4 import BeautifulSoup# soup.find_all()中限制結果的個數 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b">Elsie</a> <a href="link1" class="a">Tillie</a> <a href="link1" class="c">df</a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') print(soup.find_all('a', limit=2))

運行結果如下:

[<a class="b" href="link1">Elsie</a>, <a class="a" href="link1">Tillie</a>]
  • keyword參數:關鍵詞參數keyword可以讓你選擇那些具有指定屬性的標簽,例如:
from bs4 import BeautifulSouptext = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link1" class="a" id='id1'>Tillie</a> <a href="link1" class="c" id='id2'>df</a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') all_label = soup.find_all(id="id1") print(all_label[0].get_text())

運行結果:

Elsie

使用keyword參數的注意事項:

  • 關鍵詞參數可以使用其他方法替代,例如下面的兩行代碼功能是一樣的:

    bsobj.find_all(id="text") bsobj.find_all("", {"id": "text"})
  • 在使用keyword偶爾也會出現問題,尤其在用class屬性查找標簽時,因為class是Python中受保護的關鍵字,而Python中不能拿關鍵字作為參數名。不過,BeautifulSoup提供了有點兒臃腫的方案,在class下面添加一個下劃線:

    bsobj.find_all(class_="green")

    當然,你也可以這樣寫:

    bsobj.find_all("", {"class"="green"})

find()方法

除了find_all()方法,還有find()方法,只不過find()方法返回的是單個的標簽,也就是第一個匹配的標簽,而find_all()方法返回的是所有匹配的標簽組成的列表。

from bs4 import BeautifulSoup# bs_object.find()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link1" class="a" id='id1'>Tillie</a> <a href="link1" class="c" id='id2'>df</a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') print(soup.find(id="id1")) # 這里如果使用的是find_all方法,返回的將是一個包含兩個標簽的列表

運行結果:

<a class="b" href="link1" id="id1">Elsie</a>

可以看到,符合id=id1的標簽有兩個,但是find()方法只會返回第一個符合條件的標簽。


prettify()方法

這個方法可以將html文本補齊并且將其美化:

from bs4 import BeautifulSoup# bs_object.prettify()方法的使用 text = ''' <html><head> <title>The Dormouse'sstory</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link1" class="a" id='id1'> Tillie</a> <a href= "link1" class="c" id='id2'>df</a> </body>'''soup = BeautifulSoup(text, 'html.parser') print(soup.prettify())

運行結果:

<html><head><title>The Dormouse'sstory</title></head><body><a class="b" href="link1" id="id1">Elsie</a><a class="a" href="link1" id="id1">Tillie</a><a class="c" href="link1" id="id2">df</a></body> </html>

使用prettify()方法之前的HTML文本有一些標簽是缺少結束標簽的,而且格式是亂的,從執行的結果來看,prettify()方法將結束標簽補齊了,也對HTML文本進行了格式化。


其他查詢方法:
  • find_parents()和find_parent():前者返回所有祖先節點,后者返回直接父節點

  • find_next_siblings()和find_next_sibling():前者返回后面的所有的兄弟節點,后者返回后面的第一個節點

  • find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟節點,后者返回前面的第一個兄弟節點

  • find_all_next()和find_next():前者返回節點后所有符合條件的節點,后者返回第一個符合添加的節點

  • find_all_previous()和find_previous():前者返回節點前的所有符合條件的節點,后者返回節點前的第一個符合條件的節點



3.1.4.6 使用Lambda表達式


BeautifulSoup允許我們將特定的函數當做find_all()方法的參數。唯一的限制條件是這些函數必須把一個標簽當做參數且返回結果是布爾類型。BeautifulSoup用這個函數來篩選它遇到的每一個標簽,將符合Lambda中的刪選條件的標簽保留下來。

下面的例子就使用Lamabd表達式來篩選出所有有兩個屬性的標簽:

from bs4 import BeautifulSoup# BeautifulSoup中Lambda表達式的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" >df</a> <a link="https"></a> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') # 使用lambda表達式將標簽屬性為2的標簽篩選出來 print(soup.find_all(lambda tag: len(tag.attrs) == 2))

運行結果:

[<a class="c" href="link3">df</a>]

3.1.4.5 css選擇器


BeautifulSoup還提供了另外一種選擇器,那就是css選擇器。要使用css選擇器,只需要調用select()方法,傳入相應的css選擇器即可。

選擇器示例示例說明
elementp選擇所有的<p>元素
element,elementdiv,p選擇所有<div>元素和<p>元素
element elementdiv p選擇<div>元素內的所有<p>元素
.class.intro選擇所有class="intro"的元素
#id#firstname選擇所有id="firstname"的元素
\*\*選擇所有元素
[attribute][target]選擇所有帶有target屬性元素
[attribute=value][target=blank]選擇所有target="blank"的元素
[attribute*=value][title*=f]選擇所有title屬性中包含f單詞的元素
[attribute^=value][lang^=en]選擇lang屬性以en開頭的所有元素
[attribute$=value][href$=.jpg]選擇所有href屬性以.jpg結尾的元素
tag.get_texta.get_text獲取a標簽中的文本內容
from bs4 import BeautifulSoup# bs_object.select()方法中使用css選擇器 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html> '''soup = BeautifulSoup(text, 'html.parser')print("選取所有的a標簽:", soup.select('b'))print("選取所有class屬性為a的a標簽", soup.select('a .a'))print("選取所有class屬性為a且id屬性為id1的a標簽", soup.select('a .a #id1'))print("選取所有link屬性為https的a節點:", soup.select('a[link="https"]'))print("選取所有link屬性中包含f的b節點", soup.select('b[link*="f"]'))print("選取所有link屬性以b開頭的b標簽", soup.select('b[link^="b"]'))

運行結果:

選取所有的a標簽: [<b link="af"></b>, <b link="bba"></b>] 選取所有class屬性為a的a標簽 [] 選取所有class屬性為a且id屬性為id1的a標簽 [] 選取所有link屬性為https的a節點: [<a link="https"></a>] 選取所有link屬性中包含f的b節點 [<b link="af"></b>] 選取所有link屬性以b開頭的b標簽 [<b link="bba"></b>]

嵌套選擇
from bs4 import BeautifulSoup# BeautifulSoup中使用嵌套選擇 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') for i in soup.select('html'):print(i.select('head'))print(i.select('title'))

運行結果:

[<head><title>The Dormouse's story</title></head>] [<title>The Dormouse's story</title>]

獲取屬性
from bs4 import BeautifulSoup#BeautifulSoup支持使用css選擇器獲取標簽 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <b link="af"></b> <b link="bba"></b> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') for i in soup.select('b'):print(i['link'])print(i.attrs['link']) af af bba bba

獲取文本
from bs4 import BeautifulSoup#獲取標簽的文本內容 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <b link="af">def</b> <b link="bba">oo</b> </body> </html> '''soup = BeautifulSoup(text, 'html.parser') for i in soup.select('b'):print(i.string)print(i.get_text())

運行結果:

def def oo oo

3.1.5 使用BeautifulSoup爬取qq音樂的首發音樂

from bs4 import BeautifulSoup import requests from fake_useragent import UserAgent# 使用BeautifulSoup爬取qq音樂的首發音樂 url = 'https://y.qq.com/' response = requests.get(url=url, headers={'user-Agent': UserAgent().chrome}) soup = BeautifulSoup(response.text, 'html.parser')divs_1 = soup.find('div', {'id': 'new_album_box'}) names = divs_1.select('span.playlist__title_txt > a') authors = divs_1.select('div.playlist__author > a') for name, author in zip(names, authors):print(name.text, author.text, sep=" ")

運行結果:

倒帶 劉珂 不再年少 大志 英雄如你 洛天依 愿你可以 王琪瑋 愛我的時候 單依純 鷂 周興哲 紅火中國年 小5 除夕 郭秀楓 一起過年 唐詩 蒙著眼睛走 大志

3.2 Xpath(重點)


3.2.1 Xpath介紹


Xpath,全稱是XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言。它最初是用來搜索XML文檔的,但是同樣適用于HTML文檔的搜索。

W3C的Xpath教程

菜鳥教程的Xpath教程

Xpath helper插件

Xpath官方文檔



3.2.2 Xpath的常用規則


選取節點

Xpath使用路徑表達式在XML文檔中選取節點

表達式描述實例實例含義
nodename選取此節點的所有子節點a選取a節點的所有子節點
/從根節點開始選取/a選取根節點a
//從任意節點開始選取//a選取所有的a節點,不管它在文檔中的位置
.選取當前節點//a[@class="class1" and id="id1"]選取所有的class屬性為class1且id屬性為id1的節點
..選取當前節點的父節點//a[@class="class1"]//..選取所有class屬性為class1的a節點的父節點
@選取屬性//a[@class="class1"]選取所有class屬性為class1的節點
text()選取節點中的文本//a[class="class1"]/text()選取所有class屬性為class1的a節點的文本內容
*匹配任何節點/a/*選取a節點下的所有子節點

謂語

謂語用來查找特定的節點,謂語被嵌在方括號中

路徑表達式結果
/a/b[1]選取a節點下的第一個b節點
/a/b[last()]選取a節點下的最后一個b節點
/a/b[last()-1]選取a節點下的倒數第二個b節點
/a/b[position()<3]選取a節點下的前2個b節點
/a[@class]選取所有的有class屬性的a節點
/a[@*]選取所有有屬性的a節點
/a[@class="class1"]選取所有class屬性為class1的a節點
/a/b[@price>20]選取a節點下所有price屬性的值大于20的b節點
/a[contains(@class, “a”)]選取所有class屬性中包含a單詞的節點
/a[@class=“abc” and @id=“abc”]選取所有class屬性為abc且id屬性為abc的a節點

Xpath的語法推薦大家在Chrome中使用Xpath helper插件來練習,練習熟練之后就可以在Python中使用了!

Xpath helper插件:
鏈接: https://pan.baidu.com/s/1gOa8vewuIUhQ0GTefjrNsQ
提取碼: sp4m



3.2.3 Xpath的使用


3.2.3.1 安裝lxml

在Python中使用Xpath要安裝lxml庫:

pip install lxml

3.2.3.2 使用Xpath


使用Xpath解析HTML文本

from lxml import etree# 使用etree.HTML()方法解析HTML文本 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html> '''html = etree.HTML(text, etree.HTMLParser()) result = html.xpath('/html/head/title/text()') print(result)

運行結果:

["The Dormouse's story"]

上面的Xpath解析式/html/head/title/text()選取html標簽下的head標簽下的title標簽的文本,再將結果打印出來。

在Python爬蟲中使用Xpath的關鍵就是根據要提取的內容寫成對應的Xpath表達式,只要將Xpath表達式寫好,替換上面的代碼中的Xpath表達式就可以提取到想要的內容了,所有,大家學習Xpath的重點在:會根據需要提取的信息寫出對應的Xpath表達式。


使用Xpath解析HTML文檔

from lxml import etree# 使用etree.parse()方法解析HTNL文檔 html = etree.parse('htmlText.html', etree.HTMLParser()) result = html.xpath('/html/head/title/text()') print(result)

使用Xpath解析HTML文檔使用的是etree.parse()方法,
htmlTest.html文檔中的內容:

<html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html>

運行結果:

["The Dormouse's story"]

3.2.3.3 xpath使用技巧

  • 可以使用concat()方法將兩個xpath表達式的結果合并

    爬取鏈家網中二手房的價格使用的xpath表達式:

    concat(//div[@class=“price”]/span[1]/text(),//div[@class=“price”]/span[2]/span/text())

  • 可以使用last()方法從篩選出的標簽列表的末尾開始提取標簽:

    爬取鏈家網中二手房的供暖情況使用的xpath表達式:

    //div[@class=“base”]/div[@class=“content”]/ul/li[last()-1]/text()

  • contains()的使用

//div[contains(@name,’Tom’)] 查找name屬性中包含字符串Tom的所有div標簽



3.2.4 使用Xpath爬取窮游網的中國熱門城市

import requests from fake_useragent import UserAgent import parsel import csvdef getdata(url):headers = {"user-Agent": UserAgent().chrome}response = requests.get(url=url, headers=headers)response.encoding = response.apparent_encodingselector = parsel.Selector(response.text) # 把字符串類型轉化為對象lis = selector.xpath('//ul[@class="plcCitylist"]/li')for li in lis:city_names = li.xpath('./h3/a/text()').get()city_names = city_names.rstrip()number_people = li.xpath('./p[2]/text()').get()place_hot = li.xpath('./p[@class="pois"]/a/text()').getall()place_hot = [place.strip() for place in place_hot]place_hot = '、'.join(place_hot)place_url = li.xpath('./p[@class="pics"]/a/@href').get()img_url = li.xpath('./p[@class="pics"]/a/img/@src').get()print(city_names, number_people, place_url, img_url, place_hot, sep='|')with open('qiongyouData.csv', mode='a', encoding='utf-8', newline='') as file_object:csv_write = csv.writer(file_object)csv_write.writerow([city_names, number_people, place_url, img_url, place_hot])def main():for i in range(1, 172):url = "https://place.qyer.com/china/citylist-0-0-{}/".format(str(i))getdata(url)if __name__ == '__main__':main()

代碼運行后將在控制臺打印爬取到的數據,并將數據寫入qingyouData.csv文件,由于沒有使用多線程,所以爬取所有的數據花費時間較長。



3.3 pyquery(了解)


雖然 xpath 與 Beautiful Soup 已經很強大了,不過語法還是過于啰嗦,pyquery提供了更加簡潔優雅的語法,你可以像寫jquery一般提取數據。

如果你使用過jQuary,那么你可能更適合使用pyquery解析庫。

pyquery官方文檔

3.3.1 pyquery的安裝


和之前一樣,在cmd控制臺中輸入以下代碼來使用pip安裝pyquery庫:

pip install pyquery

3.3.2 初始化

像BeautifulSoup一樣,初始化pyquery的時候,也需要傳入一個HTML文本來初始化一個pyQuery對象。它的初始化的方式有很多,比如直接傳入字符串,傳入URL,傳入文件名等等。


  • 字符串的初始化
from pyquery import PyQuery as pq# 將字符串初始化為pyquery對象 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html> '''doc = pq(text) print(doc('b'))

運行結果:

<b link="af"/> <b link="bba"/>
  • URL初始化

初始化的參數可以是一個URL,此時只需要指定參數為url即可,但是,一般情況下都不會傳入一個URL來初始化,因為通常都會出現編碼方式出錯導致出現亂碼。

from pyquery import PyQuery as pq# 將URL鏈接初始化為pyquery對象 doc = pq(url='https://www.baidu.com', encoding='utf-8') print(doc('title'))

運行結果:

<title>百度一下,你就知道</title>
  • 文件初始化

要使用文件來初始化pyquery,只需要指定filename即可:

from pyquery import PyQuery as pq# 將文件初始化為pyquery對象 doc = pq(filename='pyqueryTest.html') print(doc('a'))

下面是pyqueryTest.html中的內容:

<html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> <a link="https"></a> <b link="af"></b> <b link="bba"></b> </body> </html>

下面是運行結果:

<a href="link1" class="b" id="id1">Elsie</a> <a href="link2" class="a" id="id1">Tillie</a> <a href="link3" class="c" id="id2">df</a> <a link="https"/>

3.3.3 pyquery的使用


pyquery支持css選擇器: from pyquery import PyQuery as pq# pyquery中使用css選擇器 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </body> </html> ''' html = pq(text) print(html('a.b#id1'))

首先傳入text將pyquery初始化,讓后傳入’a.b#id1’這個選擇器,這個選擇器的功能是選擇所有class屬性為b且id屬性為id1的a標簽。

運行結果如下:

<a href="link1" class="b" id="id1">Elsie</a>

下面是一些常用的查詢函數,這些函數和jQuery中函數的用法完全相同:

方法介紹
PyQuery.find('css')在當前節點的所有子孫節點中查找所有滿足css選擇器的節點,返回的是PyQuery對象。
PyQuery.children('css')和find()的用法一樣,只不過它的查找范圍是子節點。
PyQuery.parent()獲取當前節點的父節點,返回的是PyQuery對象。
PyQuery.parents('css')獲取當前節點的祖先節點,返回的是PyQuery對象。
PyQuery.siblings('css')獲取當前節點的兄弟節點,返回的是PyQuery對象。
PyQuery.items()得到當前節點的生成器,用于遍歷PyQuery對象。
PyQuery.attr()獲取當前節點的屬性,當PyQuery中包含多個節點時,attr()只會返回第一個節點的屬性。
PyQuery.text()獲取文本,但PyQuery中包含多個節點時,它將返回一個將所有節點的文本合并成的字符串。
PyQuery.html()獲取標簽中的HTML文本,如果PyQuery中包含多個節點,它將返回第一個節點中的HTML文本。
PyQuery.addClass()為節點添加一個class
PyQuery.removeClass()移除節點的一個class
PyQuery.attr(' ', ' ')更改節點的屬性內容
PyQuery.text(' ')修改節點內容
PyQuery.html(' ')修改節點內的HTML文本
PyQuery.remove()移除節點

下面使用實例向大家介紹這些方法的使用過程:

find()

from pyquery import PyQuery as pq# pq_object.find()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <li> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </li> </body> </html> ''' pq_object = pq(text) # 初始化一個pyquery對象 bod = pq_object('body') # 在pyquery對象中查找body標簽 print(type(bod))a = bod.find('a.b#id1') # 在body標簽的子孫節點中查找class屬性為a,id屬性為id1的a標簽 print(type(a)) print(a.text())

運行結果:

<class 'pyquery.pyquery.PyQuery'> <class 'pyquery.pyquery.PyQuery'> Elsie

children()

from pyquery import PyQuery as pq# pq_object.children()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <li> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </li> </body> </html> '''pq_object = pq(text) bod = pq_object('body') print(bod.children('a'))

運行代碼發現沒有打印任何內容,因為children()方法是在body標簽的子標簽中查找a標簽,而body標簽的子標簽只有li標簽,要提取所有的a標簽,需要將代碼改一下:

from pyquery import PyQuery as pq# pq_object.children()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <li> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </li> </body> </html> '''pq_object = pq(text) bod = pq_object('li') print(bod.children('a'))

運行結果:

<a href="link1" class="b" id="id1">Elsie</a> <a href="link2" class="a" id="id1">Tillie</a> <a href="link3" class="c" id="id2">df</a>

parent()

from pyquery import PyQuery as pq# pq_object.parent()方法的使用 text = ''' <body> <li> <a class="b" id='id1'>Elsie</a> </li> </body> '''pq_object = pq(text) a = pq_object('a.b#id1') print(a.parent()) print('-'*50) print(a.parents()) <li> <a class="b" id="id1">Elsie</a> </li>-------------------------------------------------- <body> <li> <a class="b" id="id1">Elsie</a> </li> </body><li> <a class="b" id="id1">Elsie</a> </li>

siblings()

from pyquery import PyQuery as pq# pq.object.siblings()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </body> </html> '''pq_object = pq(text) a = pq_object('a.a#id1') print(a.siblings())

運行結果:

<a href="link1" class="b" id="id1">Elsie</a> <a href="link3" class="c" id="id2">df</a>

items()

from pyquery import PyQuery as pq# pq_object.items()方法的使用 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie</a> <a href="link2" class="a" id='id1'>Tillie</a> <a href="link3" class="c" id='id2'>df</a> </body> </html> '''pq_object = pq(text) a = pq_object('a') for i in a.items():if i.attr('href') == 'link1':print(i)

運行結果:

<a href="link1" class="b" id="id1">Elsie</a>

html()

from pyquery import PyQuery as pq# pq_object.html()方法的使用 text = ''' <head> <title>The Dormouse's story</title> </head> '''pq_object = pq(text) head = pq_object('head') print(head.html())

運行結果:

<title>The Dormouse's story</title>

節點操作

from pyquery import PyQuery as pq# pyquery對節點的操作 text = ''' <html><head><title>The Dormouse's story</title></head> <body> <a href="link1" class="b" id='id1'>Elsie<b>text</b></a> </body> </html> '''pq_object = pq(text)a = pq_object('a.b#id1') a.add_class('new_class') print("將a節點增加class屬性'new_class的結果為:", a)a.remove_class('b') print("將a節點移除class屬性b的結果為:", a)a.attr('href', 'new_link') print("將a節點中的href屬性更改為'new_link'后的結果為:", a)a.text('new_text') print("將a節點的text更改為'new_text'后的結果為:", a)a.html('<b>b_new_text</b>') print("將a節點的HTML更改為'<b>b_new_text</b>'后的結果為:", a)doc = pq_object('html') a.remove() print("將a節點刪除后的結果為:", doc)

運行結果:

將a節點增加class屬性'new_class的結果為: <a href="link1" class="b new_class" id="id1">Elsie<b>text</b></a>將a節點移除class屬性b的結果為: <a href="link1" class="new_class" id="id1">Elsie<b>text</b></a>將a節點中的href屬性更改為'new_link'后的結果為: <a href="new_link" class="new_class" id="id1">Elsie<b>text</b></a>將a節點的text更改為'new_text'后的結果為: <a href="new_link" class="new_class" id="id1">new_text</a>將a節點的HTML更改為'<b>b_new_text</b>'后的結果為: <a href="new_link" class="new_class" id="id1"><b>b_new_text</b></a>將a節點刪除后的結果為: <html><head><title>The Dormouse's story</title></head> <body> </body> </html>

好了,上面就介紹完了Python網絡爬蟲中常用的四個解析庫BeautifulSoup、Xpath(重點)、pyquery、re(重點),其中re在第二章 基本庫的使用 中介紹了,要將這些解析庫學好,大量的練習是必不可少的,希望大家能多多實踐,將學的知識用起來。


最后,感謝你的閱讀。

總結

以上是生活随笔為你收集整理的Python爬虫 解析库的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

日韩av视屏在线观看 | 在线a亚洲视频播放在线观看 | 免费看污黄网站 | 日韩色高清 | 日日夜夜综合网 | 精品久久久久一区二区国产 | 日韩精品中文字幕在线 | 婷婷色在线视频 | 国产一区二区精品 | 麻豆精品91 | 国产午夜三级一二三区 | 九九免费在线观看视频 | 精品91| 亚洲欧美视频 | 免费国产视频 | 日韩黄色一级电影 | 国偷自产视频一区二区久 | 日韩免费电影 | 免费日韩 精品中文字幕视频在线 | 久99视频 | 久久精品日产第一区二区三区乱码 | 久久久久免费精品国产小说色大师 | 色综合色综合久久综合频道88 | 99在线热播 | 18+视频网站链接 | 午夜少妇| 免费又黄又爽的视频 | 精品国产a| 热精品| 中文字幕一区二区在线观看 | 激情丁香综合五月 | 五月天高清欧美mv | 国产精品99精品久久免费 | 国产精品18久久久久久久久久久久 | 久久久午夜精品理论片中文字幕 | 亚洲一级黄色大片 | 高潮毛片无遮挡高清免费 | 亚洲成人999 | 中国一区二区视频 | 精品久久一区 | 91精品国产高清自在线观看 | 91av手机在线观看 | www.久草视频 | 日韩丝袜视频 | 五月婷婷六月综合 | 国产一二三区在线观看 | 91亚色在线观看 | 天天干天天拍天天操天天拍 | 免费黄色av | 中文字幕精品一区 | 久草电影在线观看 | 天天干夜夜夜 | 日本激情视频中文字幕 | 色网站免费在线观看 | 日韩av一区二区三区 | 成年一级片 | 久久精品99视频 | 69久久99精品久久久久婷婷 | 欧美亚洲一区二区在线 | 国产精品亚洲片夜色在线 | 手机av在线不卡 | 中文字幕在线人 | 欧美日韩二区在线 | 日本公乱妇视频 | 九九视频精品免费 | 91综合久久一区二区 | 成人一级免费视频 | 日韩av片免费在线观看 | 在线超碰av| 在线观看视频黄 | 成人av免费播放 | 亚洲欧美国产精品 | 欧美日韩三区二区 | 国产日韩视频在线播放 | 二区中文字幕 | 最新中文字幕视频 | 国产一区在线视频播放 | 二区三区在线 | 超碰97国产精品人人cao | 操操操日日日干干干 | 少妇性xxx| 成人欧美一区二区三区在线观看 | 国产999精品视频 | 91精品视频观看 | 国产精品一区二区 91 | av在线播放一区二区三区 | 日本精品久久 | 国产在线精 | 国产精品视频区 | 亚洲精品av中文字幕在线在线 | 国产蜜臀av | 日韩精品一区二区在线视频 | 日韩精品一区二区久久 | 国产中文字幕视频在线观看 | 亚洲一区网 | 国产高清视频免费最新在线 | h网站免费在线观看 | 日韩欧美在线视频一区二区 | 中文字幕在线观看的网站 | 在线国产欧美 | av在线com | 色综合久久久久久中文网 | 亚洲精品无 | 激情电影在线观看 | 国产成人精品一区二三区 | 久草视频在线免费播放 | 99精品免费 | 99久久这里只有精品 | 久久少妇免费视频 | 嫩小bbbb摸bbb摸bbb | www日韩在线| 亚洲天天综合网 | 日韩精品在线免费播放 | 国产日本在线播放 | 九九99 | 黄色一级在线免费观看 | 亚洲午夜电影网 | 欧美一级特黄高清视频 | 国产免费又黄又爽 | 久久99电影 | 黄色网www | 亚洲乱码国产乱码精品天美传媒 | 亚洲乱码一区 | 国产va精品免费观看 | 国产精品久久久久亚洲影视 | 岛国大片免费视频 | 久久久综合九色合综国产精品 | 婷婷亚洲五月 | 久久久私人影院 | 免费欧美| 日韩免费电影一区二区 | 日韩在线一二三区 | 久草免费电影 | 久久午夜国产精品 | 在线免费观看麻豆 | 不卡精品视频 | 狠狠色伊人亚洲综合网站色 | 欧美精品久久久久a | 激情在线网站 | www视频免费在线观看 | 激情久久久| 欧美国产在线看 | 午夜久久影视 | 久久久久久激情 | 国产日产精品久久久久快鸭 | 懂色av一区二区在线播放 | av不卡中文字幕 | 日日干网 | 久草在线视频国产 | 国产一在线精品一区在线观看 | 成人在线一区二区三区 | 天天操福利视频 | 丁香激情婷婷 | 91精品欧美 | 国产91免费在线 | 欧美性生爱 | 久久精品中文字幕少妇 | zzijzzij日本成熟少妇 | 免费午夜视频在线观看 | 粉嫩一区二区三区粉嫩91 | 国产精品久久久久久久婷婷 | 日韩a在线 | 91免费在线视频 | 国产精品乱码久久久久久1区2区 | 日韩午夜在线 | 国产人成免费视频 | 国产va在线 | 麻豆精品视频在线 | 摸bbb搡bbb搡bbbb | 黄色免费网 | 又污又黄的网站 | 日韩高清在线一区二区三区 | 成年人免费在线观看网站 | 一区三区视频 | 中文字幕制服丝袜av久久 | www.天堂av| 视频国产 | 日韩电影在线观看一区二区 | 狠狠色伊人亚洲综合网站野外 | 久久99精品久久久久久秒播蜜臀 | 成人四虎 | 成人久久18免费 | 激情网五月婷婷 | 一级欧美一级日韩 | 美女一区网站 | 97超碰人人干 | 天堂在线免费视频 | 91色在线观看视频 | 国产成人精品一区二区 | 97自拍超碰| 国产高清视频在线播放一区 | 天天射天天射天天 | 日韩亚洲国产精品 | 天天草av | 麻豆手机在线 | 在线观看精品视频 | 色99导航| 欧洲视频一区 | 色婷婷骚婷婷 | 日日夜夜人人天天 | 国产一级二级三级在线观看 | 欧美视频在线观看免费网址 | 日本爱爱免费视频 | 极品美女被弄高潮视频网站 | 精品视频免费久久久看 | 亚洲成a人片77777kkkk1在线观看 | 久久综合久久久久88 | 综合亚洲视频 | 欧美成人性网 | 亚洲精选视频在线 | 国产视频97| 欧美一区日韩一区 | www色婷婷com| 91精品天码美女少妇 | 亚洲欧美精品一区二区 | 精品免费一区 | 欧美动漫一区二区三区 | 91精品导航 | 欧美美女激情18p | 国产黄色免费电影 | 99热国产在线中文 | 亚洲精品国产第一综合99久久 | 久草网视频在线观看 | 在线视频18在线视频4k | 97超碰福利久久精品 | 99精品国产免费久久 | 久久久天堂 | 中文字幕一区二区三区四区在线视频 | 国产小视频在线观看 | 日韩精品中文字幕有码 | 99国产精品久久久久久久久久 | 九色琪琪久久综合网天天 | 日韩在线国产 | 特级西西444www大胆高清无视频 | 特级毛片在线观看 | 国产精品一区二区三区免费视频 | 97在线观看免费 | 久久无码精品一区二区三区 | 久久久久看片 | 91视频三区 | 91视频大全 | 国产视 | 免费在线观看日韩视频 | 五月婷婷综合在线视频 | 人人爽人人爽人人片av | 日韩电影一区二区在线 | 亚洲午夜精品在线观看 | 久久综合色婷婷 | 超碰97久久 | 国产日韩欧美自拍 | 亚洲女欲精品久久久久久久18 | 国产成人三级一区二区在线观看一 | 婷婷亚洲综合五月天小说 | 国产又粗又猛又色又黄视频 | 日韩久久精品一区二区三区下载 | 久久99久久99精品免观看粉嫩 | 黄p在线播放 | 日韩狠狠操 | 日本黄色免费观看 | 欧美一级片免费观看 | 天天综合成人网 | 免费观看av网站 | 亚洲欧洲国产精品 | 久久99视频精品 | a特级毛片| 亚洲三级av | 日本三级国产 | 三级黄色大片在线观看 | 午夜999| 日韩色高清 | 国产午夜亚洲精品 | 天天射天天艹 | 国产麻豆精品久久一二三 | 久久精品中文字幕一区二区三区 | 中文字幕资源网在线观看 | 国产美女网站视频 | 精品久久精品 | 亚洲综合色丁香婷婷六月图片 | 激情av网址 | www欧美色 | 五月婷婷综合色拍 | 精品99在线观看 | 国产精品综合久久久久 | 欧美日韩激情视频8区 | 99久久激情| 天天插天天狠天天透 | 欧美视频不卡 | 婷婷午夜激情 | 亚洲在线成人精品 | 精品久久一区二区三区 | 精品免费一区 | 成人在线观看资源 | 丝袜av网站 | 国产免费观看久久 | 久久久久久久久福利 | 夜夜操天天 | 国产成人一区二区三区在线观看 | 国产成人福利片 | 免费观看性生交 | 日韩精品中文字幕在线观看 | 九九热精品国产 | 国产97在线看 | 午夜视频免费播放 | 九九免费精品视频在线观看 | 久久久精品在线观看 | 婷婷国产v亚洲v欧美久久 | 色婷婷99| 国产中文字幕视频在线观看 | 亚洲国产97在线精品一区 | 中文字幕欧美日韩va免费视频 | 日日干天夜夜 | 亚洲国产手机在线 | 91你懂的| 久操免费视频 | 狠狠干狠狠色 | 国产精品日韩久久久久 | 人人爽人人片 | 久草免费在线视频观看 | 久久男女视频 | 欧美日韩另类在线观看 | 亚洲激情在线视频 | 亚洲精品免费播放 | 亚洲一区二区三区在线看 | 97超碰超碰 | 在线观看av不卡 | 久久久亚洲网站 | 182午夜在线观看 | 亚洲欧美经典 | 日日干 天天干 | 四虎影视成人精品国库在线观看 | 精品一区二区免费在线观看 | 久久综合五月婷婷 | av黄色一级片 | 免费在线观看黄网站 | 91大神在线观看视频 | 欧美精品在线观看免费 | 天天天操操操 | 国产视频2 | 国产啊v在线观看 | 日韩美女一级片 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 91黄视频在线| 91高清免费观看 | 国产精品久久久99 | 亚洲国产三级在线 | 91最新在线 | 久久免费看av | 国产在线视频一区二区 | 久久久久99精品国产片 | av大全在线观看 | 人人草在线视频 | 亚洲精品在线电影 | 国产激情免费 | 国产精品18久久久久久久久久久久 | 超碰免费av| 日韩免费中文字幕 | 日本中文在线 | 久久草网站 | 中文字幕刺激在线 | 97成人在线 | 亚洲综合精品在线 | 中文字幕的 | 国产免费高清视频 | 久久久在线免费观看 | 国产精品久久久久影院 | 最近中文字幕在线播放 | 黄色免费网站 | 久久a国产 | 亚洲激情网站免费观看 | 国产v在线播放 | 久草免费在线 | 在线国产日本 | 亚洲理论片在线观看 | 国产成人精品亚洲精品 | 91麻豆精品国产自产在线 | 日韩欧美视频 | 成年在线观看 | 亚洲 欧美 综合 在线 精品 | 天天操综合网 | 国产精品久久久久久久久久久久午夜 | 狠狠做深爱婷婷综合一区 | 国产日韩欧美视频 | 91精品在线视频观看 | 国产一级片不卡 | av免费观看高清 | 综合久久五月天 | 在线观看国产高清视频 | 亚洲精选视频在线 | 久久久99精品免费观看 | 日韩四虎 | 久久9999久久 | 黄色成品视频 | 91中文在线 | 天天色天天操天天爽 | 丁香激情婷婷 | 亚洲区精品| 国产精品麻豆视频 | 亚洲成aⅴ人片久久青草影院 | 久久亚洲日本 | 国产精品一级视频 | 日韩在线视频线视频免费网站 | 免费观看一级特黄欧美大片 | www.夜夜操.com| 狠狠干 狠狠操 | 国产精品成人国产乱 | 97超碰中文字幕 | 久久99精品久久久久久秒播蜜臀 | 亚洲综合国产精品 | 日韩中文字幕在线不卡 | 91看片在线免费观看 | 天天操天天操天天操天天操天天操 | 午夜精品久久久久久久99水蜜桃 | 成年人在线免费看视频 | 亚洲国产精品va在线看黑人 | 亚洲高清视频一区二区三区 | 日韩欧美精品在线观看视频 | 国产精品一区二区久久 | 五月天堂色 | 久久精品久久精品久久 | 久久人人97超碰精品888 | 深夜男人影院 | 一区久久久 | 亚洲国产精品99久久久久久久久 | 欧美日韩性生活 | 天天干天天操天天入 | 亚洲精品美女在线 | 亚洲更新最快 | 一区二区在线电影 | 69国产盗摄一区二区三区五区 | 日韩有码第一页 | 操操操天天操 | 日韩高清一 | 在线观看视频中文字幕 | 久久久久久97三级 | 国产特级毛片aaaaaaa高清 | 亚洲人天堂 | 狠狠狠狠狠干 | 亚洲欧洲精品一区二区精品久久久 | 人人爽人人看 | 国产不卡视频在线播放 | 91成人久久 | 四虎影视成人精品国库在线观看 | 亚洲午夜精品久久久久久久久久久久 | 欧美一区二区免费在线观看 | 久久久久成人免费 | 成人久久免费 | 亚洲电影影音先锋 | 国产黄网站在线观看 | 久久不卡免费视频 | 最近中文国产在线视频 | a天堂中文在线 | 麻豆精品在线视频 | 黄色综合| 国产精品理论片 | 国内视频在线 | www.夜色.com | 夜夜操综合网 | 三级黄免费看 | 六月丁香激情综合色啪小说 | 9在线观看免费高清完整版在线观看明 | 国产精品自在线拍国产 | 狠狠色婷婷丁香六月 | 99精品免费在线 | 涩涩伊人 | 亚洲人xxx | 麻豆免费看片 | 激情九九 | 日韩成人在线一区二区 | 激情综合色综合久久综合 | 操少妇视频 | 99re久久资源最新地址 | 国产h片在线观看 | 成人精品国产免费网站 | 免费中文字幕视频 | 国产综合视频在线观看 | 九月婷婷色 | 久久久久久久久亚洲精品 | 精产嫩模国品一二三区 | 日本黄网站 | 亚洲,国产成人av | 亚洲五月婷 | 免费99精品国产自在在线 | 久久综合九色 | 亚洲欧洲精品一区二区 | 在线观看91精品视频 | 99婷婷 | 91欧美精品| 三级av中文字幕 | 成人一区二区三区在线 | 国产精品毛片一区二区三区 | 日本公妇在线观看 | 一区二区三区在线免费观看视频 | 日韩av免费网站 | 黄色在线观看www | 韩国在线视频一区 | 成人免费在线观看入口 | 国产精品专区在线观看 | a精品视频 | 天天操夜操 | 日本在线成人 | 狠狠干综合网 | 色久网 | 中文久草| 99久热精品 | 不卡的av在线 | 在线欧美中文字幕 | 日本中文字幕网站 | 免费日韩三级 | 极品嫩模被强到高潮呻吟91 | 最近免费中文视频 | 日韩欧美在线一区 | 日韩午夜大片 | 日韩一区二区三区高清免费看看 | 天天操天天综合网 | 人人爽人人爽人人爽 | 天天干,天天射,天天操,天天摸 | 日韩黄色免费看 | 成人久久久精品国产乱码一区二区 | 西西444www| 99看视频在线观看 | 国产精品福利在线播放 | 久久99精品久久久久久清纯直播 | 免费在线观看日韩视频 | 91九色最新地址 | 91成人精品视频 | 少妇18xxxx性xxxx片 | 日日干激情五月 | 色欲综合视频天天天 | 精品成人在线 | 永久中文字幕 | www.888av| 久久久久久黄色 | 349k.cc看片app| 午夜久久成人 | 91精品爽啪蜜夜国产在线播放 | 精品视频免费播放 | 五月天婷婷丁香花 | 精品国产免费人成在线观看 | 一区二区三区在线观看 | 中文字幕 国产专区 | 在线а√天堂中文官网 | 欧美日韩高清 | 免费视频三区 | 免费日韩一级片 | 国产在线观看中文字幕 | 免费看v片网站 | 亚洲精品乱码 | 日韩网站在线免费观看 | 麻豆视频在线 | 欧美日韩精品影院 | 成人午夜电影免费在线观看 | 国产精品免费久久久久 | 国产亚洲精品久久久久动 | 涩涩网站在线观看 | 久久亚洲精品国产亚洲老地址 | 九九视频网站 | 日韩欧美区 | 日韩在线观看不卡 | 亚洲欧美日韩不卡 | 激情影院在线 | 午夜精品久久久久99热app | 日韩精品高清视频 | 日韩成人看片 | 亚洲精品网址在线观看 | 99 国产精品 | 在线国产91 | 国内揄拍国产精品 | 99久久99热这里只有精品 | 精品视频国产 | 免费看国产视频 | 一级黄色片毛片 | 久产久精国产品 | 97人人模人人爽人人少妇 | 97视频在线观看成人 | 亚洲黄色一级视频 | 国产综合视频在线观看 | 免费特级黄色片 | 制服丝袜在线91 | 欧美在线99 | 黄色的网站免费看 | 国产成人一区三区 | www.色com | 国产精品久久久久久电影 | av爱干| 国产资源在线免费观看 | 99视频99 | 久久综合色天天久久综合图片 | 五月激情丁香婷婷 | 麻豆传媒视频在线免费观看 | 国产精品h在线观看 | 久久美女精品 | 久久麻豆视频 | 香蕉看片| 最新动作电影 | 99精品视频精品精品视频 | 天天摸天天操天天爽 | 六月丁香激情综合色啪小说 | 欧美在线观看禁18 | 91在线看黄 | 色婷五月天 | 国产亚洲资源 | 久久精品国产久精国产 | 欧美夫妻性生活电影 | 国产一区二区日本 | 四虎永久精品在线 | 人人插人人搞 | 91人人澡人人爽人人精品 | 久久看看| 久操伊人 | 国产黄免费在线观看 | 91大神一区二区三区 | 亚洲国产理论片 | 国产经典三级 | 国产精品美女在线 | 日韩精品一区在线观看 | 玖玖玖精品| 九九免费精品 | 免费a视频在线观看 | 亚洲第一av在线播放 | 久久综合免费视频 | 国产一级大片免费看 | 日本精品久久久一区二区三区 | 91精品国产91p65 | 久久草av| www.狠狠| 免费在线国产黄色 | 欧美成人69av| 在线只有精品 | 99在线观看免费视频精品观看 | 91香蕉国产| 成人三级网站在线观看 | 亚洲国产日韩一区 | 97福利在线 | 国产黄色精品在线 | 91成人在线视频观看 | 久99视频 | 国产精品久久麻豆 | 一区二区丝袜 | 日韩av免费大片 | 婷婷在线不卡 | 久久婷婷激情 | 亚洲视频456 | 99久久免费看 | 久久这里只有精品1 | 日韩午夜三级 | 天天射天 | 91精品国产91久久久久 | 亚洲在线视频免费观看 | 少妇性色午夜淫片aaaze | 亚洲激情久久 | 日韩午夜视频在线观看 | 国产中年夫妇高潮精品视频 | 国产精品久久久久久模特 | 国产视频精选 | 探花视频免费观看高清视频 | 91在线视频观看 | 天天爱天天射天天干天天 | 97超碰在线免费观看 | 黄色av电影在线观看 | 欧美日韩高清在线一区 | 天天艹天天 | 中文字幕一二三区 | www.五月天| 成人av动漫在线观看 | 香蕉在线影院 | 中文字幕精品三级久久久 | 在线观看中文字幕一区二区 | 亚洲成a人片在线观看网站口工 | 91亚洲精品在线 | 中文字幕网站 | 国产美女免费看 | 国产精品18久久久久久首页狼 | 日本三级大片 | 欧美国产不卡 | 91在线精品一区二区 | 99精品一区| 青青草在久久免费久久免费 | 精品一区免费 | 中文字幕永久 | 中文字幕一区2区3区 | 99视频在线免费观看 | 日韩高清在线看 | 丰满少妇久久久 | 久草手机视频 | 国产成人精品久久亚洲高清不卡 | 久久国产高清视频 | 日韩一区二区在线免费观看 | 91av网址 | 久久国产亚洲 | 国产高清成人在线 | 久草影视在线观看 | 欧美网址在线观看 | 婷婷色 亚洲 | 干狠狠 | 国产免费人成xvideos视频 | 999久久国产 | 中文字幕在线免费观看 | 亚洲精品在线视频观看 | 久久亚洲成人网 | 国产成人三级在线播放 | 国产免费一区二区三区网站免费 | 国产精品不卡一区 | 中文字幕人成一区 | 99久久精品国产毛片 | 欧美色图狠狠干 | 国产三级久久久 | 日本性生活一级片 | 狠狠躁夜夜躁人人爽超碰91 | 波多野结衣精品视频 | 国产精品久久久久久久久久新婚 | 中文字幕永久免费 | 中文字幕av电影下载 | 久久午夜电影网 | 欧美一区二区伦理片 | 天天做天天爱天天爽综合网 | 日本久久视频 | 精品在线观看一区二区 | 99在线高清视频在线播放 | 中文字幕之中文字幕 | 波多野结衣久久资源 | www.天天草 | www.夜夜操.com | 亚洲麻豆精品 | 色婷婷久久一区二区 | 国产91丝袜在线播放动漫 | 欧美日韩国产三级 | 99视频国产在线 | 视频国产| 欧美成人播放 | 人人讲下载 | 亚洲伊人网在线观看 | 日日爱视频 | 日日夜夜人人天天 | 久久黄色影院 | 少妇bbw搡bbbb搡bbbb | 最新日韩在线观看 | 五月婷婷一区二区三区 | 国产免费三级在线观看 | 国产在线高清 | 粉嫩av一区二区三区四区五区 | 亚洲精品乱码久久久久久蜜桃不爽 | 天天鲁天天干天天射 | 亚洲va欧洲va国产va不卡 | 超碰人人av | 亚洲精品在线观看视频 | 成人一区二区三区在线 | 精品xxx | 国产成人精品综合久久久 | 99久久精品免费一区 | 国产va精品免费观看 | 亚洲精选99 | 中文视频在线看 | 四虎影视国产精品免费久久 | 国产999在线观看 | 韩国三级在线一区 | 激情网在线视频 | 亚洲精品久久久蜜臀下载官网 | 免费麻豆网站 | 超碰97免费 | 色婷婷综合久久久中文字幕 | 日韩www在线 | 综合在线观看色 | 中文字幕在线观看第二页 | 99久久久国产精品美女 | 日韩免费在线一区 | 亚洲精品国产欧美在线观看 | 911久久| 日本系列中文字幕 | 色综合久久88色综合天天人守婷 | 久久久久久久国产精品视频 | 91网页版在线观看 | 久久久久久久久久久久久国产精品 | 精品欧美一区二区在线观看 | 久草久热 | 国产中文字幕大全 | 天天综合网 天天综合色 | 国产免码va在线观看免费 | 五月婷婷久久丁香 | 国产专区精品视频 | 人人爽人人爽人人片 | 欧美日韩啪啪 | 黄色精品国产 | 日韩在线视频观看 | www.色五月.com| 亚洲在线高清 | 久久国产精品一国产精品 | 天天干中文字幕 | 国产无吗一区二区三区在线欢 | 日日夜夜精品免费 | 欧美日韩不卡一区二区 | 91精品久久久久久综合五月天 | aaa亚洲精品一二三区 | 国产午夜亚洲精品 | 国产91精品一区二区麻豆亚洲 | 六月色婷 | 久久久影院一区二区三区 | 国产欧美日韩一区 | 亚洲,国产成人av | 日韩高清在线不卡 | 色网av| 中文字幕在线观 | 四虎影院在线观看av | 97人人模人人爽人人喊中文字 | 国产日本三级 | 99精品区 | 国产成人99久久亚洲综合精品 | 午夜视频福利 | www黄| 亚洲一区二区三区精品在线观看 | 国产亚洲亚洲 | 日韩剧 | 午夜国产福利在线 | 在线观看日本高清mv视频 | 国产香蕉久久精品综合网 | av黄色大片| 五月天久久精品 | 国产视频在线免费 | 亚洲女同videos | 国产精品久久99综合免费观看尤物 | 成人午夜性影院 | 超碰在线免费福利 | 狠狠狠色丁香婷婷综合久久88 | 国产中文字幕一区二区 | 天天操天天干天天爽 | 国产美女网 | 精品一区二区6 | 91成人精品一区在线播放 | 97天天综合网 | 欧美激情第一页xxx 午夜性福利 | 91视频观看免费 | 日韩av片在线 | 国产一区二三区好的 | 国产视频一区精品 | 五月婷婷黄色 | 久久亚洲精品电影 | 亚洲精品字幕在线 | 国产亚洲精品女人久久久久久 | 国产精品黄色av | 黄色片网站av | 成人黄色电影在线播放 | 久久精品精品电影网 | 国内久久精品 | 国产精品成人在线 | 亚洲砖区区免费 | 久久久精选 | 手机在线小视频 | 免费福利影院 | 日韩av不卡在线 | 久久久久欠精品国产毛片国产毛生 | 国产在线视频一区 | 欧美日韩伦理一区 | 五月天六月婷婷 | 日本午夜在线观看 | 日韩精品中文字幕在线观看 | 亚洲 欧洲 国产 精品 | 免费观看成人 | 999久久久国产精品 高清av免费观看 | 91精品国产自产在线观看永久 | 国产成人黄色片 | 久久黄色影院 | 亚洲国产精品99久久久久久久久 | 日韩成人免费在线 | 久久综合九色综合97_ 久久久 | av千婊在线免费观看 | 国产精品视频免费观看 | 色综合久久久久综合体 | 在线播放日韩av | 午夜精品影院 | 成人精品一区二区三区中文字幕 | 国产精品久久一卡二卡 | 色婷婷亚洲婷婷 | 搡bbbb搡bbb视频| 久久成人高清视频 | 999国产在线 | 中文字幕av播放 | 国产高清视频在线免费观看 | 缴情综合网五月天 | 亚洲草视频 | 九色精品免费永久在线 | 中文字幕之中文字幕 | 婷婷六月天丁香 | 亚洲一区 av | 日本中文一区二区 | av丁香花| 国产又粗又硬又长又爽的视频 | 色欧美成人精品a∨在线观看 | 99久久精品久久久久久清纯 | 成年人在线看片 | av一区二区在线观看中文字幕 | www.夜夜骑.com | 国产精品视频免费 | 亚洲综合五月 | av动态图片 | 精一区二区 | 国产不卡免费 | 狠狠色丁香久久婷婷综合丁香 | 国产免费国产 | 久久久久综合 | 性色av免费在线观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产一性一爱一乱一交 | 91人人网| 国产男女免费完整视频 | 草久久精品 | 午夜神马福利 | 久久精品日产第一区二区三区乱码 | 蜜臀av网站| 日韩欧美视频免费看 | 美女网站视频免费黄 | 丰满少妇在线观看资源站 | 国产成人精品午夜在线播放 | 玖玖在线资源 | 六月丁香激情综合色啪小说 | 精品国产一区二区三区男人吃奶 | 97国产精品亚洲精品 | 99精品国产99久久久久久福利 | 天天操天天色综合 | 国产精品久久久久久模特 | 成人动漫精品一区二区 | 国产精彩视频一区二区 | 天堂网一区二区三区 | 最新av免费在线观看 | 婷婷色 亚洲 | 激情欧美一区二区免费视频 | 最近中文字幕 | 91精品国产高清自在线观看 | 天天爽夜夜爽精品视频婷婷 | 日韩精品91偷拍在线观看 | 亚洲91在线 | 亚洲国产免费看 | 久草免费福利在线观看 | 91视频黄色 | 久久久精品在线观看 | 香蕉在线视频观看 | 国产在线视频在线观看 | 国产黄色在线 | 探花系列在线 | 狠狠狠综合 | 九九涩涩av台湾日本热热 | 高清日韩一区二区 | 中文字幕在线有码 | 特黄特色特刺激视频免费播放 | 久久视频在线 | 久草热久草视频 | 久久成人国产精品入口 | 国产99久久九九精品 | 日韩精品网址 | 啪啪凸凸 | 亚洲视频 中文字幕 | 国产又粗又硬又爽的视频 | 国产一级片免费观看 | 久久精品国产成人 | 九七视频在线 | 国产专区第一页 | 国产综合视频在线观看 | 日韩av在线看 | 国产精品嫩草影院123 | 成人午夜电影在线观看 | 狠狠狠色丁香婷婷综合久久88 | 日韩在线国产 | 蜜臀aⅴ国产精品久久久国产 | 四虎永久免费在线观看 | 欧美日韩亚洲第一 | 成人在线播放av | 激情伊人五月天久久综合 | 国产91成人在在线播放 | 中文字幕有码在线观看 | 中文字幕黄色av | 亚洲国产精品免费 | 免费男女羞羞的视频网站中文字幕 | 麻豆精品国产传媒 | 一区二区三区免费在线播放 | 国产在线 一区二区三区 | 亚洲专区欧美专区 | 久久午夜视频 | 日韩午夜av电影 | 人人爽爽人人 | 在线成人一区 | 91豆麻精品91久久久久久 | 久久综合亚洲鲁鲁五月久久 | 在线黄色免费 | 日日夜av| 欧美一级在线观看视频 | 久日视频 | 一区二区在线电影 | 99亚洲国产精品 | 国产中文字幕在线看 | 91久久久久久国产精品 | 日韩av看片 | 男女男视频| 在线国产中文字幕 | 免费在线观看中文字幕 | av大全免费在线观看 | 特级毛片在线 | 一区二区三区免费在线观看 | 婷婷丁香激情网 | 久久精品五月 | av高清在线观看 |