Datawhale-爬蟲-Task3(beautifulsoup)

TNTZS666發表於2019-03-03

Beautiful Soup

  • Beautiful Soup是一個非常流行的Python模組。該模組可以解析網頁,並提供定位內容的便捷介面。
  • 使用Beautiful Soup的第一步是將已下載的HTML內容解析為soup文件。由於大多數網頁都不具備良好的HTML格式,因此Beautiful Soup需要對其實際格式進行確定。

例如,在下面這個簡單的網頁列表中,存在屬性值兩側引號缺失和標籤未閉合的問題:

<ul class = country>
	<li>Area
	<li>Population
</ul>

如果Population列表項被解析為Area列表的子元素,而不是並列兩個列表項的話,我們在抓取時就會得到錯誤的結果。下面我們看一下Beautiful Soup是如何處理的。

from bs4 import BeautifulSoup
broken_html = '<ul class=country><li>Area<li>Population</ul>'
soup = BeautifulSoup(broken_html,'html.parser')
fixed_html = soup.prettify()
print(fixed_html)
<ul class = "country">
	<li>Area</li>
	<li>Population</li>
</ul>

從上面結果可以看出,Beautiful soup能正確解析缺失的引號並閉合標籤,現在我們就可以使用find()和findall()方法來定位我們需要的元素了。

案例:

使用beautifulsoup提取下面丁香園論壇的特定帖子的所有回覆內容,以及回覆人的資訊。

  • 首先進去丁香園論壇檢視源網頁找到相關的HTML標籤

發帖人:
在這裡插入圖片描述
帖子的內容:
在這裡插入圖片描述
發現這兩個標籤都是唯一的,所以直接使用find在HTML中找到標籤即可:

user_id = item.find("div", "auth").get_text()
content = item.find("td", "postbody").get_text("|", strip=True)

所有程式碼:

import requests
from bs4 import BeautifulSoup as bs

def get_soup():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
    }
    url = 'http://www.dxy.cn/bbs/thread/626626'
    try:
        html = requests.get(url,headers = headers)
        if html.status_code == 200:
            return html.text
    except:
        pass

def get_item(html):
    topic_con = bs(html, 'lxml')
    table = topic_con.find_all('tbody')
    datas = []
    for item in table:
        try:
            user_id = item.find("div", "auth").get_text()
            content = item.find("td", "postbody").get_text("|", strip=True)
            datas.append((user_id, content))
        except:
            pass
    return datas


def main():
    html = get_soup()
    info = get_item(html)
    for x in info:
    	print(x)


if __name__ == '__main__':
    main()

執行結果:
在這裡插入圖片描述

相關文章