Python爬蟲對數據的響應分析庫lxml,bs4的使用

爬蟲獲取網頁後 對網頁的解析方法中常用的兩種。lxml, bs4庫

pip install lxml
pip install bs4

lxml 解析使用

xpath語法。https://www.w3school.com.cn/xpath/xpath_syntax.asp

from lxml.html import etree

html = '''
<html>
<div>
    <h2>功夫聯盟演員列表</h2>
    <ul>
         <li class="item-0"><a href="link1.html">趙文卓</a></li>
         <li class="item-1 item-3"><a href="link2.html">安志傑</a></li>
         <li class="item-0"><a href="link3.html">麥迪娜</a></li>
         <li class="item-1"><a href="link4.html">張子文</a></li>
         <li class="item-0"><a href="link5.html">梁小龍</a></li>
         <li class="item-1"><a href="link6.html">飛兒</a></li>
         <li class="item-0"><a href="link4.html">林子總</a></li>
         <li class="item-1"><a href="link5.html">張瑤</a></li>

    </ul>
</div>
</html>
 '''


# /   從根節點選取。
#     /div    選取根元素 div。    註釋:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑!
# //  從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
#     //li    選取所有li子元素,而不管它們在文檔中的位置。


tree = etree.HTML(html)

# tree.xpath() 返回結果是一個列表。。。
# 列表可能爲空(未找到響應屬性)
# 不爲空是裏面元素是<class 'lxml.etree._Element'>, 可繼續進行查找

print(type(tree))    # <class 'lxml.etree._Element'>

print(tree.xpath("/html//div"))

# 1. 獲取文件中所有的li標籤
res1 = tree.xpath("//li")
print(type(res1))   # <class 'list'>
# print(res1)         # <Element li at 0x1fad14a6808>, <Element li at 0x1fad14a6848>, ......]
print(type(res1[0]))    # <class 'lxml.etree._Element'>
print(tree.xpath("//li/a/text()"))
# 2. 查詢class屬性等於“item-1” 標籤  =  !=
print(tree.xpath("//*[@class='item-1']/a/text()"))
# 3. 查詢li標籤,class包含item字符串
print(tree.xpath("//*[contains(@class, 'item')]/a/text()"))
# 4. 查詢li標籤,class 不包含item字符串
print(tree.xpath("//*[not(contains(@class, 'item'))]/a/text()"))
# 5. 查詢li標籤,最後一個
print(tree.xpath("//li[last()]/a/text()"))
# 6. 查詢前3個li標籤  = < <= > >= !=
print(tree.xpath("//li[position()<=3]/a/text()"))
# 7. text()  和 string()    string可以跨標籤取文本,text()只能取當前標籤
print('/text()',tree.xpath('//li/text()'))
print("/string()",tree.xpath('string(//li)'))
print(tree.xpath("string(.)"))
# 8. 獲取屬性
print(tree.xpath("//li/@class"))
print(tree.xpath("//li/a/@href"))
# 9. 邏輯表達式 |    可以看做多個列表合集
print(tree.xpath("//h2/text() and //li/a/text()"))
elements = tree.xpath('//h2/text()|//li/a/text()')
elements1 = tree.xpath('//h2/text()')
elements2 = tree.xpath('//li/a/text()')
print(len(elements))
print(len(elements1+elements2))

# 依次打印每個演員鏈接和姓名
liList = tree.xpath("//li")
print(liList)   # [<Element li at 0x1ab8bd404c8>, <Element li at 0x1ab8c0d0708>...]
for li in liList:
    print(li.xpath("./a/@href")[0], end='\t') # .xpath()返回值是一個列表。即使列表中只有一個元素。
    print(li.xpath("./a/text()")[0])

bs4庫基本使用

from bs4 import BeautifulSoup
from bs4.element import Tag
# 知識點:
# 1. 安裝  pip install bs4
# 2. 學習BeautifulSoup類: 構造方法有哪些參數、有哪些屬性、有哪些方法
# BeautifulSoup對象可以找Tag
# 3. bs4.element.Tag類: 構造方法有哪些參數、有哪些屬性、有哪些方法
# Tag對象可以找tag

html = """
<h2>古龍小說全集</h2>
<div  class="nav">
    <ul>
        <li><a href="/cang/" title="蒼穹神劍" target="_top">蒼穹神劍</a></li> 
        <li><a href="/duo/" title="多情劍客無情劍" target="_top">多情劍客無情劍</a></li> 
        <li><a href="/jue/" title="絕代雙驕" target="_top">絕代雙驕</a></li> 
        <li><a href="/yue/" title="月異星邪" target="_top">月異星邪</a></li> 
    </ul>
</div>
<div class="index"><span>目錄</span><a href="/"><img src="images/icon.png" /></a></div>
"""

# 第二個參數是一個解析器。
soup = BeautifulSoup(html, features='lxml')
print(dir(soup))

# 1. 按tag查找元素   # 只返回一個元素
# print(soup.div)
print(soup.h2)
element = soup.h2
print(type(element))
print(dir(element))
# 2. tag name 可以進行多級
print(soup.li.a)
print("2",soup.li.a.get("href"))
# 3. 獲取元素的文本    text 可以跨標籤 而string不可以
print(soup.ul.string)   # None
print(soup.ul.text)
# 4. 獲取tag的屬性值 比較智能。。。可以判斷屬性可能有多個值或是單個值
print("4",soup.li.a["title"])       # str
print("4",soup.li.a.get("title"))   # str
print("4",soup.div["class"])        # list
print("4",soup.div.get("class"))    # list
print("4",soup.div.attrs)           # dict
# 5. find_all   找符合條件的所有元素 上面的只是找單個元素
'''
find_all(name, attrs, recursive, text, limit, **kwags)
- name: 按tag查找  eg:soup.find_all('div')
- attrs: 屬性過濾條件  eg: soup.find_all('div', attrs={'class': ''})
- recursive: 是否遞歸,默認值是True
- text:按tag的內容查找  eg: soup.find_all(text="hhhhhhh")
- kwargs: 關鍵參數     eg:  soup.find_all(id="")
    eg:  soup.find_all(class_="")
- limit: 用來限制查找到的結果的個數。 eg: soup.find_all("li", limit=2), 代表查找前兩個name爲li的標籤
'''
print(soup.find_all("li"))
# 使用findall方法獲取的返回值類似一個列表 和列表幾乎一摸一樣  而內部元素是一個Tag。
from bs4.element import ResultSet
books = soup.find_all("li")     # <class 'bs4.element.ResultSet'> 
for book in books:
    print(book.text)
print(soup.find_all("li"))

# 6. find  ==  find_all(limit=1)
print(soup.find("li"))
li = soup.find("li")
print(type(li), li.text)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章