Beautiful Soup - 轻轻松松玩转网页数据提取

文摘   2024-11-15 15:04   重庆  

Beautiful Soup - 轻轻松松玩转网页数据提取

网页数据提取啊,没用过Beautiful Soup的小伙伴可能觉得挺费劲。用正则表达式吧,写起来头大;直接处理HTML代码吧,又容易出错。这不,今天就带大家认识一下这个Python界的“万能铲”—— Beautiful Soup ,看看它是怎么帮我们轻松搞定网页数据提取的。


装它贼简单,一行代码的事:


pip install beautifulsoup4

还得装个解析器,推荐用lxml:


pip install lxml

拿到HTML后,创建Beautiful Soup对象就是第一步:


from bs4 import BeautifulSoup

html_doc = “”“

<html>

    

    

        

Beautiful Soup真好用

        

Python真有趣

    

</html>

”“”

soup = BeautifulSoup(html_doc, 'lxml')

💡温馨提示:创建对象时别忘了指定解析器,不然默认用的可能是Python自带的解析器,速度会慢不少。


想找标签?find()和find_all()就够用了:


# 找第一个p标签

first_p = soup.find('p')

print(first_p.text) # 输出:Beautiful Soup真好用

# 找所有p标签

all_p = soup.find_all('p')

for p in all_p:

    print(p.text)

会写CSS选择器的小伙伴有福了,select()方法简直是为你量身定做:


# 找class为note的元素

notes = soup.select('.note')

# 找id为special的p标签

special = soup.select('p#special')

💡温馨提示:用select()方法时,返回的永远是列表,就算只找到一个元素也是列表。


Beautiful Soup给标签准备了不少属性,随手就能拿到你想要的内容:


tag = soup.find('p')

print(tag.text) # 获取文本内容

print(tag.string) # 获取文本内容(只有一个子节点时)

print(tag['class']) # 获取class属性

想找相邻的标签?next_sibling和previous_sibling帮你搞定:


first_p = soup.find('p')

next_p = first_p.next_sibling.next_sibling # 跳过换行符

print(next_p.text)

💡温馨提示:用next_sibling时可能会遇到换行符,多用一次就能跳过去。


来个真实的例子,抓取网页中的文章标题:


import requests

from bs4 import BeautifulSoup

def get_titles(url):

    response = requests.get(url)

    soup = BeautifulSoup(response.text, 'lxml')

    titles = soup.select('h1.post-title') # 假设标题在h1标签中

    return [title.text.strip() for title in titles]

写代码遇到问题别着急,打印出来看看结构准没错:


print(soup.prettify()) # 格式化输出,结构一目了然

Beautiful Soup就是这么好用,网页数据提取分分钟搞定。掌握了这些基础用法,你也能轻松应对大部分数据提取场景。动手试试,你会发现原来爬取数据这么简单!


记住几个坑:编码问题记得指定utf-8;解析结果为空检查选择器是否正确;网页加载太慢可以加个超时。


码字不易,希望这些内容对你有帮助。要是还有不明白的,评论区见!

CQTV新视界
重庆广电城市TV旗下优质内容品牌,感谢您的关注!
 最新文章