整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網頁數據如何使用Python的方式進行解析?

          介概述:

          使用特定引擎解析網頁里面得數據,根據規則提取入庫

          常見的技術:

          正則、xpath、pyquery、Beautiful Soup4

          一、正則

          開源測試工具 http://tool.oschina.net/regex/

          官網:https://docs.python.org/zh-cn/3/library/re.html

          .

          匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。

          \d

          匹配一個數字字符。等價于 [0-9]。

          \D

          匹配一個非數字字符。等價于 [^0-9]。

          \s

          匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。

          \S

          匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。

          \w

          匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'。

          \W

          匹配任何非單詞字符。等價于 '[^A-Za-z0-9_]'。

          1、match

          用法: 提取關鍵參數 比如 token sign 后端返回得簽名信息 算法

          • match 方法會嘗試從字符串的起始位置匹配正則表達式,如果匹配,就返回匹配成功的結果;如果不匹配,就返回 None
          import re
          content = 'Hello 123 456 welcome to world'
          print(len(content))
          result = re.match('^Hello\s\d\d\d\s\d{3}\s\w{7}', content)
          print(result)
          print(result.group())
          print(result.span())
          • group() 返回被 正則 匹配的字符串
          • start() 返回匹配開始的位置
          • span() 返回一個元組包含匹配 (開始,結束) 的位置

          方法

          說明

          group(num=0)

          匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組

          groups()

          返回一個包含所有小組字符串的元組,從 1 到 所含的小組號

          1)匹配數字

          import re
          content = 'Hello 123456 welcome to world'
          result = re.match('^Hello\s(\d+)\swelcome', content)
          print(result)
          print(result.group(1))
          print(result.span())

          2)通用匹配

          import re
          content = 'Hello 123 456 welcome to world'
          # 匹配所有數據
          result = re.match('^Hello.*ng$', content)
          # 匹配某某開始到某某結束
          result = re.match('^Hello(.*)ng$', content).group(1)
          print(result)
          print(result.group())
          print(result.span())

          3)貪婪和非貪婪

          • python默認貪婪模式
          • 在"*","?","+","{m,n}"后面加上?,使貪婪變成非貪婪
          import re
          content1 = 'http://xxxxx.com/yyds/baidu'
          result2 = re.match('http.*com/(.*?)s', content1)
          result2 = re.match('http.*?com/(.*)s', content1)
          print('result1', result1.group())
          print('result2', result2.group())

          4)修飾符

          re.I

          使匹配對大小寫不敏感

          re.L

          做本地化識別(locale-aware)匹配

          re.M

          多行匹配,影響 ^ 和 $

          re.S

          使 . 匹配包括換行在內的所有字符

          re.U

          根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B.

          re.X

          該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。

          import re
          # 這個修飾符的作用是匹配包括換行符在內的所有字符。
          content = '''Hello 1234567 World_This
          is a Regex Demo
          '''
          result = re.match('^He.*?(\d+).*?Demo$', content)
          result = re.match('^He.*?(\d+).*?Demo$', content,re.S)
          print(result.group())

          2、search

          用法: 提取數據

          re模塊中的search函數對整個字符串進行掃描并返回第一個匹配的結果。從左到右進行掃描

          1)匹配數據

          text = '人生苦短,我用pythons'
          res1 = re.search('python',text)
          data = 'result:{"name":"王五","age":"20"}'
          res3 = re.search("{.*?}",data)

          2)正則提取案例

          地址:https://finance.ifeng.com/c/8HzIujEasuH

          url = 'https://finance.ifeng.com/c/8HzIujEasuH'
          from utils.base import Spider
          res = Spider().fetch(url)
          import re
          # 不帶符號
          # text = re.findall('var allData = {(.*)};',res.text)
          # 帶符號
          # text = re.findall('var allData\s=\s(.*);',res.text)

          3)匹配中文

          [\u4e00-\u9fa5]
          s = '大家晚上好asdasdsad'
          aa = re.findall('[\u4e00-\u9fa5]+',s)


          二、 Pyquery

          環境安裝

          pip install pyquery

          利用它,我們可以直接解析 DOM 節點的結構,并通過 DOM 節點的一些屬性快速進行內容提取。

          html = '''
          <div id="cont">
          <ul class="slist">
          <li class="item-0">web開發</li>
          <li class="item-1"><a href="link2.html">爬蟲開發</a></li>
          <li class="item-0 active"><a href="link3.html"><span class="bold">數據分析</span></a></li>
          <li class="item-1 active"><a href="link4.html">深度學習</a></li>
          <li class="item-0"><a href="link5.html">機器學習</a></li>
          </ul>
          </div>
          '''

          1、實例演示

          from pyquery import PyQuery as pq
          doc = pq(html)
          print(doc('li'))

          2、css選擇器

          doc = pq(html)
          print(doc('#cont .slist li'))
          print(type(doc('#cont .slist li')))

          3、提取內容

          for item in doc('#cont .slist li').items():
              print(item.text())

          4、子節點

          from pyquery import PyQuery as pq
          doc = pq(html)
          items = doc('.slist')
          print(type(items))
          print(items) # 提取節點所有內容
          lis = items.find('li') # 獲取符合條件的li標簽
          print(type(lis))
          print(lis)

          5、 屬性獲取

          from pyquery import PyQuery as pq
          doc = pq(html)
          a = doc('.item-0.active a')
          print(a, type(a))
          print(a.attr('href'))

          6、遍歷提取

          doc = pq(html)
          a = doc('a')
          for s in a.items():
              print(s.attr('href')) # 屬性獲取
              print(s.text()) # 值獲取


          三、 xpath

          插件下載:https://chrome.zzzmh.cn/index#/search

          XPath 的選擇功能十分強大,它提供了非常簡潔明了的路徑選擇表達式。另外,它還提供了超過 100 個內建函數,用于字符串、數值、時間的匹配以及節點、序列的處理等。幾乎所有我們想要定位的節點,都可以用 XPath 來選擇。

          官網:https://www.w3.org/TR/xpath/

          安裝xpath解析庫:

          pip install lxml

          表 3-1 XPath 常用規則

          表 達 式

          描  述

          nodename

          選取此節點的所有子節點

          /

          從當前節點選取直接子節點

          //

          從當前節點選取子孫節點

          .

          選取當前節點

          ..

          選取當前節點的父節點

          @

          選取屬性

          案例演示

          text = '''
          <div>
          <ul>
          <li class="item-0"><a href="link1.html">first item</a></li>
          <li class="item-1"><a href="link2.html">second item</a></li>
          <li class="item-inactive"><a href="link3.html">third item</a></li>
          <li class="item-1"><a href="link4.html">fourth item</a></li>
          <li class="item-0"><a href="link5.html">fifth item</a>
          </ul>
          </div>
          '''

          1、解析

          from lxml import etree
          html = etree.HTML(text)
          result = etree.tostring(html)
          print(result.decode('utf-8'))

          2、節點操作

          我們一般會用 // 開頭的 XPath 規則來選取所有符合要求的節點。這里以前面的 HTML 文本為例,如果要選取所有節點,可以這樣實現:

          這里使用 * 代表匹配所有節點,也就是整個 HTML 文本中的所有節點都會被獲取。可以看到,返回形式是一個列表,每個元素是 Element 類型,其后跟了節點的名稱,如 html、body、div、ul、li、a 等,所有節點都包含在列表中了。

          result = html.xpath('//*')

          3、子節點

          result = html.xpath('//li/a')
          result = html.xpath('//li/a/text()') # 提取數據
          result = html.xpath('//li/a/@href') # 屬性值

          4、指定節點獲取

          result = html.xpath('//li[@class="item-0"]/a/text()')
          print(result)
          # ['first item', 'fifth item']

          5、匹配翻頁元素

          # 最后一個
          //div[@class="page"]/a[last()-1]
          # 下一頁
          //div[@class="page"]/a[text()="下一頁>"]/@href

          6、案例演示

          ? 說明:提取當前網站的首頁標題信息,要求使用xpath解析器

          from lxml import etree
          url1= 'https://www.icswb.com/channel-list-channel-162.html'
          res4 = Spider().fetch(url=url1)
          html = etree.HTML(res4.text)
          li = html.xpath('//ul[@id="NewsListContainer"]/li')
          for i in li:
          href = i.xpath('./h3/a/text()')
          print(href)


          四、 Beautiful Soup

          簡單來說,BeautifulSoup 就是 Python 的一個 HTML 或 XML 的解析庫,我們可以用它來方便地從網頁中提取數據,官方的解釋如下:

          BeautifulSoup 提供一些簡單的、Python 式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
          BeautifulSoup 自動將輸入文檔轉換為 Unicode 編碼,輸出文檔轉換為 utf-8 編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時你僅僅需要說明一下原始編碼方式就可以了。
          BeautifulSoup 已成為和 lxml、html5lib 一樣出色的 Python 解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。

          表 4-1 Beautiful Soup 支持的解析器

          解析器

          使用方法

          優勢

          劣勢

          Python 標準庫

          BeautifulSoup(markup, "html.parser")

          Python 的內置標準庫、執行速度適中 、文檔容錯能力強

          Python 2.7.3 or 3.2.2) 前的版本中文容錯能力差

          LXML HTML 解析器

          BeautifulSoup(markup, "lxml")

          速度快、文檔容錯能力強

          需要安裝 C 語言庫

          LXML XML 解析器

          BeautifulSoup(markup, "xml")

          速度快、唯一支持 XML 的解析器

          需要安裝 C 語言庫

          html5lib

          BeautifulSoup(markup, "html5lib")

          最好的容錯性、以瀏覽器的方式解析文檔、生成 HTML5 格式的文檔

          速度慢、不依賴外部擴展

          通過以上對比可以看出,lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強,所以推薦

          1、安裝

          pip install beautifulsoup4

          2、demo

          from bs4 import BeautifulSoup
          # 2個參數 html 文本 解析引擎
          soup = BeautifulSoup('<p>Hello world</p>', 'lxml')
          print(soup.p.string)

          3、節點選擇器

          直接調用節點的名稱就可以選擇節點元素,再調用 string 屬性就可以得到節點內的文本了,這種選擇方式速度非常快。如果單個節點結構層次非常清晰,可以選用這種方式來解析。

          下面再用一個例子詳細說明選擇元素的方法:

          html = """
          <html><head><title>The Dormouse's story</title></head>
          <body>
          <p class="title" name="dromouse"><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, 'lxml')
          print(soup.title)
          print(type(soup.title))
          print(soup.title.string)
          print(soup.head)
          print(soup.p)

          4、獲取屬性

          每個節點可能有多個屬性,比如 id 和 class 等,選擇這個節點元素后,可以調用 attrs 獲取所有屬性:

          print(soup.p.attrs)
          print(soup.p.attrs['name'])

          5、嵌套選擇

          html = """
          <html><head><title>The Dormouse's story</title></head>
          <body>
          """
          from bs4 import BeautifulSoup
          soup = BeautifulSoup(html, 'lxml')
          print(soup.head.title)
          print(type(soup.head.title))
          print(soup.head.title.string)

          6、select(根據選擇器選取指定內容)

          標簽選擇器(a),類選擇器(.dudu),id選擇器(#lala),組合選擇器(a, .dudu, #lala, .meme),層級選擇器(div.dudu#lala.meme.xixi 表示下面好多級和 div>p>a>.lala 只能是下面一級 ),偽類選擇器(不常用),屬性選擇器 (input[name=‘lala’])

          1)樣例

          htmls = """
          <html>
              <head>
                  <title>The Dormouse's story</title>
              </head>
              <body>
                  <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" title="xl">
                          <span>Elsie</span>
                      </a>
                      <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> 
                      and
                      <a href="http://example.com/tillie" class="sister" id="link3" rel="noopener noreferrer ">Tillie</a>
                      and they lived at the bottom of a well.
                  </p>
                  <p class="story">...</p>
          """

          2)層級選擇器

          soup.select('.story > a > span')[0].text

          3)id選擇器

          print(soup.select('#link1'))

          4)提取屬性

          soup.select('#link1')[0].attrs['href']

          5)屬性選擇器

          print(soup.select("input[type='password']"))

          6)提取實際數據

          義上講,爬蟲只負責抓取,也就是下載網頁。而實際上,爬蟲還要負責從下載的網頁中提取我們想要的數據,即對非結構化的數據(網頁)進行解析提取出結構化的數據(有用數據)。

          所以說,網頁下載下來只是第一步,還有重要的一步就是數據提取。不同的爬蟲想要的數據不一樣,提取的數據也就不一樣,但提取方法都是類似的。

          最簡單的提取數據的方法,就是使用正則表達式,此種方法簡單,提取的邏輯也不能復雜,不然寫出的正則表達式就晦澀難懂,甚至不能提取復雜的數據結構。

          最終,老猿經過多年的使用經驗,選擇了lxml和xpath來解析網頁提取結構化數據。順便說一下 BeautifulSoup,它也是一個很棒的解析HTML的工具,可以使用多個解析器,比如Python標準庫的parser,但是速度比較慢,也可以使用lxml作為解析器,但是它的使用方法、API跟lxml不太一樣。使用下來,還是lxml的API更舒服。

          lxml 對C語言庫 libxml2和 libxslt進行綁定,提供了Pythonic的API,它有一些主要特點:

          • 支持標準的XML
          • 支持(損壞)的HTML
          • 非常快的解析速度
          • Pythonic的API更易于使用
          • 使用Python的unicode字符串
          • 內存安全(沒有段錯誤)
          • 不需要手動管理內存

          總結為一句話就是,C語言的速度和Python的簡易相結合的神器。

          lxml有兩大部分,分別支持XML和HTML的解析:

          • lxml.etree 解析XML
          • lxml.html 解析html

          lxml.etree可以用來解析RSS feed,它就是一個XML格式的文檔。然而爬蟲抓取的絕大部分都是html網頁,所以,我們這里主要講述lxml.html解析網頁的方法。

          lxml.html 從html字符串生成文檔樹結構

          我們下載得到的網頁就是一串html字符串,如何把它輸入給lxml.html模塊,從而生成html文檔的樹結構呢?

          該模塊提供了幾種不同的方法:

          • parse(filename_url_or_file):
          • 輸入的是一個文件名、URL或文件對象(有read()方法)。
          • document_fromstring(string):
          • 輸入的是一個html的字符串,創建一個HTML文檔樹結構,它的根節點就是, 和 子節點。
          • fragment_fromstring(string, create_parent=False):
          • 返回輸入字符串的HTML片段。這個片段壁紙只含有一個element(元素),也就是單一節點,除非給出了create_parent 參數,否則會報錯。
          • fragments_fromstring(string):
          • 返回包含輸入字符串中所有片段的列表。
          • fromstring(string):
          • 返回值依據輸入字符串而定,如果輸入看起來像是一個文檔,則返回document_fromstring(string),如果是一個單一片段,則返回fragment_fromstring(string)。

          下面我們通過具體示例來說明上面幾個方法的不同。

          document_fromstring 的使用方法

          In [1]: import lxml.html as lh
          In [2]: z = lh.document_fromstring('<span>abc</span><span>xyz</span>')
          # 可以看到,它自動加了根節點<html>
          In [3]: z
          Out[3]: <Element html at 0x7fc410667b88>
          In [4]: z.tag
          Out[4]: 'html'
          # 還加了<body>節點
          In [5]: z.getchildren()
          Out[5]: [<Element body at 0x7fc4101a3ae8>]
          # 把字符串的兩個節點放在了<body>里面
          In [6]: z.getchildren()[0].getchildren()
          Out[6]: [<Element span at 0x7fc410092bd8>, <Element span at 0x7fc410667c28>]
          

          fragment_fromstring 的使用

          In [11]: z = lh.fragment_fromstring(‘<div>abc</div><div>xyz</div>’)
          ---------------------------------------------------------------------------
          ParserError Traceback (most recent call last)
          <ipython-input-11-a11f9a0f71d1> in <module>()
          ----> 1 z = lh.fragment_fromstring(‘<div>abc</div><div>xyz</div>’)
          ~/.virtualenvs/py3.6/lib/python3.6/site-packages/lxml/html/__init__.py in fragment_fromstring(html, create_parent, base_url, parser, **kw)
           850 raise etree.ParserError(
           851 “Multiple elements found (%s)”
          --> 852 % ‘, ‘.join([_element_name(e) for e in elements]))
           853 el = elements[0]
           854 if el.tail and el.tail.strip():
          ParserError: Multiple elements found (div, div)
          # 可以看到,輸入是兩個節點(element)時就會報錯
          # 如果加上 create_parent 參數,就沒問題了
          In [12]: z = lh.fragment_fromstring('<div>abc</div><div>xyz</div>', create_parent='p')
          In [13]: z.tag
          Out[13]: 'p'
          In [14]: z.getchildren()
          Out[14]: [<Element div at 0x7fc40a41a818>, <Element div at 0x7fc40a41aea8>]
          

          fragments_fromstring 的使用

          # 輸入字符串含有一個節點,則返回包含這一個節點的列表
          In [17]: lh.fragments_fromstring('<div>abc</div>')
          Out[17]: [<Element div at 0x7fc40a124ea8>]
          # 輸入字符串含有多個節點,則返回包含這多個節點的列表
          In [18]: lh.fragments_fromstring('<div>abc</div><div>xyz</div>')
          Out[18]: [<Element div at 0x7fc40a124b88>, <Element div at 0x7fc40a124f98>]
          

          fromstring 的使用

          In [27]: z = lh.fromstring('<div>abc</div><div>xyz</div>')
          In [28]: z
          Out[28]: <Element div at 0x7fc40a0eb368>
          In [29]: z.getchildren()
          Out[29]: [<Element div at 0x7fc410135548>, <Element div at 0x7fc40a0eb2c8>]
          In [30]: type(z)
          Out[30]: lxml.html.HtmlElement
          

          這里,fromstring輸入的如果是多個節點,它會給加一個父節點并返回。但是像html網頁都是從節點開始的,我們使用fromstring() 和 document_fromstring() 都可以得到完整的網頁結構。

          從上面代碼中我們可以看到,那幾個函數返回的都是HtmlElement對象,也就是說,我們已經學會了如何從html字符串得到HtmlElement的對象,下一節我們將學習如何操作HtmlElement對象,從中提取我們感興趣的數據。

          源:Python數據之道

          作者:Peter

          整理:陽哥

          大家好,我是陽哥。

          今天來跟大家分享用 BeautifulSoup 獲取信息的一些知識點,文章內容由公眾號讀者 Peter 創作。

          歡迎各位童鞋向公眾號投稿,點擊下面圖片了解詳情!

          爬蟲,是學習Python的一個有用的分支,互聯網時代,信息浩瀚如海,如果能夠便捷的獲取有用的信息,我們便有可能領先一步,而爬蟲正是這樣的一個工具。


          Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫。由于 BeautifulSoup 是基于 Python,所以相對來說速度會比另一個 Xpath 會慢點,但是其功能也是非常的強大,本文會介紹該庫的基本使用方法,幫助讀者快速入門。

          網上有很多的學習資料,但是超詳細學習內容還是非官網莫屬,資料傳送門:

          英文官網:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

          中文官網:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

          本文的主要內容如下:

          安裝和使用

          安裝

          安裝過程非常簡單,直接使用pip即可:

          pip install beautifulsoup4
          

          上面安裝庫最后的4是不能省略的,因為還有另一個庫叫作 beautifulsoup,但是這個庫已經停止開發了。

          因為BS4在解析數據的時候是需要依賴一定的解析器,所以還需要安裝解析器,我們安裝強大的lxml:

          pip install lxml
          

          在python交互式環境中導入庫,沒有報錯的話,表示安裝成功。

          使用

          使用過程直接導入庫:

          from bs4 import BeautifulSoup
          

          解析原理

          解析原理

          • 實例化一個BeautifulSoup對象,并且將本地或者頁面源碼數據加載到該對象中
          • 通過調用該對象中相關的屬性或者方法進行標簽定位和數據提取

          如何實例化BeautifulSoup對象

          1. 將本地的HTML文檔中的數據加載到BS對象中
          2. 將網頁上獲取的頁面源碼數據加載到BS對象中

          案例解析

          原數據

          假設我們現在本地有一個HTML文件待解析,具體內容如下,數據中有各種HTML標簽:html、head、body、div、p、a、ul、li等

          加載數據

          from bs4 import BeautifulSoup
          
          fp = open('./test.html','r',encoding='utf-8')  # 打開本地文件
          soup = BeautifulSoup(fp,'lxml')
          soup
          

          所有的數據解析都是基于soup對象的,下面開始介紹各種解析數據方法:

          soup.tagName

          soup.TagName返回的是該標簽第一次出現的內容,以a標簽為例:

          數據中多次出現a標簽,但是只會返回第一次出現的內容

          我們再看下div標簽:

          出現了2次,但是只會返回第一次的內容:

          soup.find('tagName')

          find()主要是有兩個方法:

          • 返回某個標簽第一次出現的內容,等同于上面的soup.tagName
          • 屬性定位:用于查找某個有特定性質的標簽

          1、返回標簽第一次出現的內容:

          比如返回a標簽第一次出現的內容:

          再比如返回div標簽第一次出現的內容:

          2、屬性定位

          比如我們想查找a標簽中id為“谷歌”的數據信息:

          在BS4中規定,如果遇到要查詢class情況,需要使用class_來代替:

          但是如果我們使用attrs參數,則是不需要使用下劃線的:

          soup.find_all()

          該方法返回的是指定標簽下面的所有內容,而且是列表的形式;傳入的方式是多種多樣的。

          1、傳入單個指定的標簽

          image-20210523170401516

          上面返回的是列表形式,我們可以獲取我們想要的內容:

          2、傳入多個標簽(列表形式)

          需要主要返回內容的表達形式,每個標簽的內容是單獨顯示的

          3、傳入正則表達式

          比如查看以a開頭標簽的全部內容

          查看以li標簽開頭的全部內容:

          選擇器soup.select()

          主要是有3種選擇器,返回的內容都是列表形式

          • 類選擇器:點
          • id選擇器:#
          • 標簽選擇器:直接指定標簽名

          1、類選擇器

          2、id選擇器

          3、標簽選擇器

          直接指定li標簽

          4、選擇器和find_all()可以達到相同的效果:

          soup.tagName和soup.find('tagName')的效果也是相同的:

          層級選擇器使用

          在soup.select()方法中是可以使用層級選擇器的,選擇器可以是類、id、標簽等,使用規則:

          • 單層:>
          • 多層:空格

          1、單層使用

          2、多層使用

          獲取標簽文本內容

          獲取某個標簽中對應文本內容主要是兩個屬性+一個方法:

          • text
          • string
          • get_text()

          1、text

          2、string

          3、get_text()

          3者之間的區別

          # text和get_text():獲取標簽下面的全部文本內容
          # string:只能獲取到標簽下的直系文本內容
          

          獲取標簽屬性值

          1、通過選擇器來獲取

          2、通過find_all方法來獲取

          BeautifulSoup實戰

          下面介紹的是通過BeautifulSoup解析方法來獲取某個小說網站上古龍小說名稱和對應的URL地址。

          網站數據

          我們需要爬取的數據全部在這個網址下:https://www.kanunu8.com/zj/10867.html,右鍵“檢查”,查看對應的源碼,可以看到對應小說名和URL地址在源碼中位置

          每行3篇小說在一個tr標簽下面,對應的屬性href和文本內容就是我們想提取的內容。

          獲取網頁源碼

          import requests
          from bs4 import BeautifulSoup
          import pandas as pd
          import re
          
          url = 'https://www.kanunu8.com/zj/10867.html'
          headers = {'user-agent': '個人請求頭'}
          
          response = requests.get(url = url,headers = headers)
          result = response.content.decode('gbk')   # 該網頁需要通過gbk編碼來解析數據
          # result
          

          實例化BeautifulSoup對象

          soup1 = BeautifulSoup(result,'lxml')
          # print(soup1.prettify())  美化輸出源碼內容
          

          獲取名稱和URL地址

          1、先獲取整體內容

          兩個信息全部指定a標簽中,我們只需要獲取到a標簽,通過兩個屬性href和target即可鎖定:

          # 兩個屬性href和target,不同的方法來鎖定
          
          information_list = soup1.find_all('a',href=re.compile('^/book'),target='_blank')
          information_list
          

          2、再單獨獲取兩個信息

          通過屬性來獲取URL地址,通過文本來獲取名稱

          url_list = []
          name_list = []
          
          for i in information_list:
              url_list.append(i['href'])  # 獲取屬性
              name_list.append(i.text)  # 獲取文本
          

          3、生成數據幀

          gulong = pd.DataFrame({
              "name":name_list,
              "url":url_list}
          )
          
          gulong
          

          我們發現每部小說的具體地址其實是有一個公共前綴的:https://www.kanunu8.com/book,現在給加上:

          gulong['url'] = 'https://www.kanunu8.com/book' + gulong['url']   # 加上公共前綴
          gulong.head()
          

          另外,我們想把書名的《》給去掉,使用replace替代函數:

          gulong["name"] = gulong["name"].apply(lambda x:x.replace("《",""))  # 左邊
          gulong["name"] = gulong["name"].apply(lambda x:x.replace("》","")) # 右邊
          
          # 保存
          gulong.to_csv("gulong.csv",index=False)  # 保存到本地的csv文件
          

          最后顯示的前5行數據:

          總結

          本文從BeautifulSoup4庫的安裝、原理以及案例解析,到最后結合一個實際的爬蟲實現介紹了一個數據解析庫的使用,文中介紹的內容只是該庫的部分內容,方便使用者快速入門,希望對讀者有所幫助。


          主站蜘蛛池模板: 色窝窝无码一区二区三区色欲| 色狠狠色狠狠综合一区| 日韩电影一区二区三区| 一区二区三区在线|日本| 日本一区二区三区免费高清| 国产乱码精品一区二区三区四川人 | 一区二区国产精品| 国产精品亚洲一区二区麻豆| 亚洲AV成人精品日韩一区18p| 夜色福利一区二区三区| 无码少妇一区二区三区芒果| 久久婷婷久久一区二区三区| 韩日午夜在线资源一区二区| 亚洲一区综合在线播放| 国产日本亚洲一区二区三区| 亚洲AV无码一区二区三区电影| 一区二区视频传媒有限公司| 国精产品999一区二区三区有限| 任你躁国产自任一区二区三区| 日本无卡码免费一区二区三区| 一区二区三区日韩| 日韩人妻不卡一区二区三区| 精品人妻一区二区三区毛片| 波多野结衣一区在线| 国产精品日韩欧美一区二区三区 | 蜜桃AV抽搐高潮一区二区| 中文字幕一区二区三区精彩视频 | 一区二区高清在线观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 末成年女A∨片一区二区| 久久国产午夜一区二区福利| 亚洲AV综合色一区二区三区| 久久精品无码一区二区无码| 麻豆一区二区三区精品视频| 色狠狠AV一区二区三区| 中文字幕人妻第一区| 无码AV一区二区三区无码| 精品一区二区无码AV| 麻豆亚洲av熟女国产一区二| 一色一伦一区二区三区| 精品免费AV一区二区三区|