编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

python 模块BeautifulSoup 从HTML或XML文件中提取数据

wxchong 2024-08-12 02:22:17 开源技术 18 ℃ 0 评论

一、安装

Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。

BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。

pip install beautifulsoup4

二、使用案例

from bs4 import BeautifulSoup
import requests
import asyncio
import functools
import re

house_info = []

'''异步请求获取链家每页数据'''
async def get_page(page_index):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    request = functools.partial(requests.get, f'https://sh.lianjia.com/ershoufang/pudong/pg{page_index}/',
                                headers=headers)
    loop = asyncio.get_running_loop()
    response = await loop.run_in_executor(None, request)
    return response


'''使用xpath获取房屋信息'''
def get_house_info(soup):
    house_info_list = soup.select('.info')  # 房屋title
    reg = re.compile(r'\n|\s')
    for html in house_info_list:

        house_info.append({
            'title': re.sub(reg,'',html.select('.title a')[0].getText()),
            'house_pattern': re.sub(reg,'',html.select('.houseInfo')[0].getText()),
            'price': re.sub(reg,'',html.select('.unitPrice')[0].getText()),
            'location': re.sub(reg,'',html.select('.positionInfo')[0].getText()),
            'total': re.sub(reg,'',html.select('.totalPrice')[0].getText())
        })

'''异步获取第一页数据,拿到第一页房屋信息,并返回分页总数和当前页'''
async def get_first_page():
    response = await get_page(1)
    soup = BeautifulSoup(response.text, 'lxml')
    get_house_info(soup)
    print(house_info)


if __name__ == '__main__':
    asyncio.run(get_first_page())

三、创建soup对象

soup = BeautifulSoup(markup="", features=None, builder=None,parse_only=None, from_encoding=None, exclude_encodings=None,element_classes=None)

  • markup:要解析的HTML或XML文档字符串。可以是一个字符串变量,也可以是一个文件对象(需要指定"html.parser"或"lxml"等解析器)。
  • features:指定解析器的名称或类型。默认为"html.parser",可以使用其他解析器如"lxml"、"html5lib"等。
  • builder:指定文档树的构建器。默认为None,表示使用默认构建器。可以使用"lxml"或"html5lib"等指定其他构建器。
  • parse_only:指定要解析的特定部分。可以传递一个解析器或一个标签名或一个元素的列表。
  • from_encoding:指定解析器使用的字符编码。默认为None,表示自动检测编码。
  • exclude_encodings:指定要排除的编码列表,用于字符编码自动检测。
  • element_classes:指定要用于解析文档的元素类。默认为None,表示使用默认元素类。

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup,"html.parser")

Python 的内置标准库、执行速度适中 、文档容错能力强

Python 2.7.3 or3.2.2) 前的版本中文容错能力差

LXML HTML 解析器

BeautifulSoup(markup,"lxml")

速度快、文档容错能力强

需要安装 C 语言库

LXML XML解析器

BeautifulSoup(markup,"xml")

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

需要安装 C 语言库

html5lib

BeautifulSoup(markup,"html5lib")

最好的容错性、以浏览器的方式解析文档、生成 HTML5 格式的文档

速度慢、不依赖外部扩展

四、soup对象

  1. soup.prettify(encoding=None, formatter="minimal"):返回格式化后的HTML或XML文档的字符串表示。它将文档内容缩进并使用适当的标签闭合格式,以提高可读性
  2. soup.title:返回文档的

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表