用Python3解析html的几种操作方式,你都会用吗?

Python3 使用 XPath 和 Beautiful Soup4 进行HTML内容解析 XPath(XML Path)是一种查询语言,它能在XML(Extensible Markup Language,可扩展标记语言)和HTML的树状结构中寻找结点。形象一点来说,XPath就是一种根据“地址”来“找人”的语言。用正则表达式来提取信息,经常会出现不明原因的无法提取想要内容的情况。最后即便绞尽脑汁终于把想要的内容提取了出来,却发现浪费了太多的时间。需要寻找的内容越复杂,构造正则表达式所需要花费的时间也就越多。 阅读详情

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。

先介绍基础的辅助函数,主要用于获取html并输入解析后的结束

#把传递解析函数,便于下面的修改
def get_html(url, paraser=bs4_paraser):
 headers = {
  'Accept': '*/*',
  'Accept-Encoding': 'gzip, deflate, sdch',
  'Accept-Language': 'zh-CN,zh;q=0.8',
  'Host': 'www.360kan.com',
  'Proxy-Connection': 'keep-alive',
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
 }
 request = urllib2.Request(url, headers=headers)
 response = urllib2.urlopen(request)
 response.encoding = 'utf-8'
 if response.code == 200:
  data = StringIO.StringIO(response.read())
  gzipper = gzip.GzipFile(fileobj=data)
  data = gzipper.read()
  value = paraser(data) # open('E:/h5/haPkY0osd0r5UB.html').read()
  return value
 else:
  pass
 
 
value = get_html('http://www.360kan.com/m/haPkY0osd0r5UB.html', paraser=lxml_parser)
for row in value:
 print (row)

1.lxml.html的方式进行解析

The lxml XML toolkit is a Pythonic binding for the C libraries libxml2
and libxslt. It is unique in that it combines the speed and XML
feature completeness of these libraries with the simplicity of a
native Python API, mostly compatible but superior to the well-known
ElementTree API. The latest release works with all CPython versions
from 2.6 to 3.5. See the introduction for more information about
background and goals of the lxml project. Some common questions are
answered in the FAQ. 官网

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
   def lxml_parser(page):
     data = []
     doc = etree.HTML(page)
     all_div = doc.xpath('//div[@class="yingping-list-wrap"]')
     for row in all_div:
      # 获取每一个影评,即影评的item
      all_div_item = row.xpath('.//div[@class="item"]') # find_all('div', attrs={'class': 'item'})
      for r in all_div_item:
       value = {}
       # 获取影评的标题部分
       title = r.xpath('.//div[@class="g-clear title-wrap"][1]')
       value['title'] = title[0].xpath('./a/text()')[0]
       value['title_href'] = title[0].xpath('./a/@href')[0]
       score_text = title[0].xpath('./div/span/span/@style')[0]
       score_text = re.search(r'\d+', score_text).group()
       value['score'] = int(score_text) / 20
       # 时间
       value['time'] = title[0].xpath('./div/span[@class="time"]/text()')[0]
       # 多少人喜欢
       value['people'] = int(
         re.search(r'\d+', title[0].xpath('./div[@class="num"]/span/text()')[0]).group())
       data.append(value)
     return data

2.使用BeautifulSoup,基本过时了,多的不说了,大家网上找资料看看

def bs4_paraser(html):
 all_value = []
 value = {}
 soup = BeautifulSoup(html, 'html.parser')
 # 获取影评的部分
 all_div = soup.find_all('div', attrs={'class': 'yingping-list-wrap'}, limit=1)
 for row in all_div:
  # 获取每一个影评,即影评的item
  all_div_item = row.find_all('div', attrs={'class': 'item'})
  for r in all_div_item:
   # 获取影评的标题部分
   title = r.find_all('div', attrs={'class': 'g-clear title-wrap'}, limit=1)
   if title is not None and len(title) > 0:
    value['title'] = title[0].a.string
    value['title_href'] = title[0].a['href']
    score_text = title[0].div.span.span['style']
    score_text = re.search(r'\d+', score_text).group()
    value['score'] = int(score_text) / 20
    # 时间
    value['time'] = title[0].div.find_all('span', attrs={'class': 'time'})[0].string
    # 多少人喜欢
    value['people'] = int(
      re.search(r'\d+', title[0].find_all('div', attrs={'class': 'num'})[0].span.string).group())
   # print r
   all_value.append(value)
   value = {}
 return all_value

3.使用SGMLParser,主要是通过start、end tag的方式进行了,解析工程比较明朗,但是有点麻烦,而且该案例的场景不太适合该方法。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class CommentParaser(SGMLParser):
 def __init__(self):
  SGMLParser.__init__(self)
  self.__start_div_yingping = False
  self.__start_div_item = False
  self.__start_div_gclear = False
  self.__start_div_ratingwrap = False
  self.__start_div_num = False
  # a
  self.__start_a = False
  # span 3中状态
  self.__span_state = 0
  # 数据
  self.__value = {}
  self.data = []
 
 def start_div(self, attrs):
  for k, v in attrs:
   if k == 'class' and v == 'yingping-list-wrap':
    self.__start_div_yingping = True
   elif k == 'class' and v == 'item':
    self.__start_div_item = True
   elif k == 'class' and v == 'g-clear title-wrap':
    self.__start_div_gclear = True
   elif k == 'class' and v == 'rating-wrap g-clear':
    self.__start_div_ratingwrap = True
   elif k == 'class' and v == 'num':
    self.__start_div_num = True
 
 def end_div(self):
  if self.__start_div_yingping:
   if self.__start_div_item:
    if self.__start_div_gclear:
     if self.__start_div_num or self.__start_div_ratingwrap:
      if self.__start_div_num:
       self.__start_div_num = False
      if self.__start_div_ratingwrap:
       self.__start_div_ratingwrap = False
     else:
      self.__start_div_gclear = False
    else:
     self.data.append(self.__value)
     self.__value = {}
     self.__start_div_item = False
   else:
    self.__start_div_yingping = False
 
 def start_a(self, attrs):
  if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear:
   self.__start_a = True
   for k, v in attrs:
    if k == 'href':
     self.__value['href'] = v
 
 def end_a(self):
  if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear and self.__start_a:
   self.__start_a = False
 
 def start_span(self, attrs):
  if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear:
   if self.__start_div_ratingwrap:
    if self.__span_state != 1:
     for k, v in attrs:
      if k == 'class' and v == 'rating':
       self.__span_state = 1
      elif k == 'class' and v == 'time':
       self.__span_state = 2
    else:
     for k, v in attrs:
      if k == 'style':
       score_text = re.search(r'\d+', v).group()
     self.__value['score'] = int(score_text) / 20
     self.__span_state = 3
   elif self.__start_div_num:
    self.__span_state = 4
 
 def end_span(self):
  self.__span_state = 0
 
 def handle_data(self, data):
  if self.__start_a:
   self.__value['title'] = data
  elif self.__span_state == 2:
   self.__value['time'] = data
  elif self.__span_state == 4:
   score_text = re.search(r'\d+', data).group()
   self.__value['people'] = int(score_text)
  pass
def sgl_parser(html):
 parser = CommentParaser()
 parser.feed(html)
 return parser.data

4.HTMLParaer,与3原理相识,就是调用的方法不太一样,基本上可以公用

class CommentHTMLParser(HTMLParser.HTMLParser):
 def __init__(self):
  HTMLParser.HTMLParser.__init__(self)
  self.__start_div_yingping = False
  self.__start_div_item = False
  self.__start_div_gclear = False
  self.__start_div_ratingwrap = False
  self.__start_div_num = False
  # a
  self.__start_a = False
  # span 3中状态
  self.__span_state = 0
  # 数据
  self.__value = {}
  self.data = []
 
 def handle_starttag(self, tag, attrs):
  if tag == 'div':
   for k, v in attrs:
    if k == 'class' and v == 'yingping-list-wrap':
     self.__start_div_yingping = True
    elif k == 'class' and v == 'item':
     self.__start_div_item = True
    elif k == 'class' and v == 'g-clear title-wrap':
     self.__start_div_gclear = True
    elif k == 'class' and v == 'rating-wrap g-clear':
     self.__start_div_ratingwrap = True
    elif k == 'class' and v == 'num':
     self.__start_div_num = True
  elif tag == 'a':
   if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear:
    self.__start_a = True
    for k, v in attrs:
     if k == 'href':
      self.__value['href'] = v
  elif tag == 'span':
   if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear:
    if self.__start_div_ratingwrap:
     if self.__span_state != 1:
      for k, v in attrs:
       if k == 'class' and v == 'rating':
        self.__span_state = 1
       elif k == 'class' and v == 'time':
        self.__span_state = 2
     else:
      for k, v in attrs:
       if k == 'style':
        score_text = re.search(r'\d+', v).group()
      self.__value['score'] = int(score_text) / 20
      self.__span_state = 3
    elif self.__start_div_num:
     self.__span_state = 4
 
 def handle_endtag(self, tag):
  if tag == 'div':
   if self.__start_div_yingping:
    if self.__start_div_item:
     if self.__start_div_gclear:
      if self.__start_div_num or self.__start_div_ratingwrap:
       if self.__start_div_num:
        self.__start_div_num = False
       if self.__start_div_ratingwrap:
        self.__start_div_ratingwrap = False
      else:
       self.__start_div_gclear = False
     else:
      self.data.append(self.__value)
      self.__value = {}
      self.__start_div_item = False
    else:
     self.__start_div_yingping = False
  elif tag == 'a':
   if self.__start_div_yingping and self.__start_div_item and self.__start_div_gclear and self.__start_a:
    self.__start_a = False
  elif tag == 'span':
   self.__span_state = 0
 
 def handle_data(self, data):
  if self.__start_a:
   self.__value['title'] = data
  elif self.__span_state == 2:
   self.__value['time'] = data
  elif self.__span_state == 4:
   score_text = re.search(r'\d+', data).group()
   self.__value['people'] = int(score_text)
  pass
def html_parser(html):
 parser = CommentHTMLParser()
 parser.feed(html)
 return parser.data

3,4对于该案例来说确实是不太适合,趁现在有空记录下来,功学习使用!

以上这篇对Python3 解析html的几种操作方式小结就是小编分享给大家的全部内容了,希望能给大家一个参考。

Python解析html网页,掌握这4种方法就够了 在探索Python解析HTML网页的多样化途径中,本文综述了四大主流库的运用:BeautifulSoup以其直观的API和易用性成为初学者优选;lxml凭借C语言库的绑定 ,在速度和功能完整性上占据优势,特别适合XML和XPath重度用户;PyQuery则以类似jQuery的语法吸引了熟悉前端开发者的青睐;而requests-HTML库 ,通过异步渲染和自动处理JavaScript,高效应对动态网页抓取。每种方法各有千秋,选择最佳工具需依据具体需求:静态内容提取倾向BS或PyQuery 阅读详情

相关推荐

Python之解析html内容

开始学习崔庆才的《Python3网络爬虫开发实战》 我要寻找生存的迹象 里面有段有趣的html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a Demo</title> </head> <body> <di...

fffffffff128的博客 4366

python3 解析html_Python3解析html高级操作

一、xpath相关1.1 xpath获取节点下的所有内容问题描述:xpath获取节点下的所有文本可通过“*//text()”实现,但如果想获取节点下的内容---包括文本和标签那就没有直接的办法。处理办法:此时可使用lxml.html.tostring()方法,将筛选出的标签转换为字符串。importlxml#没有下边这句直接使用lxml.html会报错lxml没有html,不懂什么道理from l...

weixin_39765697的博客 320

Python高效解析和操作 XML/HTML库之lxml使用详解

Python的lxml库是一款高效处理XML/HTML数据的强大工具,基于C语言的libxml2和libxslt库开发。文章详细介绍了lxml的安装方法、核心特性(高性能解析、XPath/XSLT支持)及基础功能(XML/HTML解析、树结构操作),并展示了XPath查询、XSLT转换等高级功能。通过网页抓取、配置管理、数据转换等实际应用场景,说明了lxml在数据处理中的实用价值。该库兼具速度与灵活性,是处理结构化文档的理想选择。

Rocky006的博客 1037

Python3学习笔记33——HTML基础

HTML长什么样?我们看一下新浪的HTML源码,竟然有6000多行! 所以,学HTML,就不要指望从新浪入手了。我们来看看最简单的HTML长什么样: <html> <head> <title>Hello</title> </head> <body> <h1>Hello,小猫咪,奶昔,你们好!<...

Darin2017的博客 421

你知道的Python数据解析有几种方式?

答案是一共有三种: 1正则表达式解析 2Xpath解析 3BeautifulSoup 一,正则表达式解析 在爬虫中,下面两种方式用的多一些~ 大致用法: pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a' +'.*?>(.*?)</a>.*?star">(.*?)</p>.*?rel

sehun_sx的博客 959

Python爬虫解析HTML代码

soup = BeautifulSoup(html_content, 'html.parser') # 也可以使用'lxml'或'html5lib'links = tree.xpath('//a/@href') # 获取所有a标签的href属性。titles = tree.xpath('//h1/text()') # 获取所有h1标签的文本。d('a').attr('href') # 获取第一个a标签的href。d('title').text() # 获取title文本。

zpzsp60573的博客 1704

Python爬虫:HTML网页解析方法小结

学过requests库的看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页爬取下来,然后再交给BeautifulSoup等一些html解析库,现在可以直接解析了。(4)requests-html 是比较新的一个库,高度封装且源码清晰,它直接整合了大量解析时繁琐复杂的操作,同时支持DOM解析和XPath解析两种方式,灵活方便,可以尝试。”**在csdn看到过一篇比较好的文章,讲的很实用,大家伙可以移步去看看,链接分享在下方。

m0_59162248的博客 6258

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

html调用python_对Python3 解析html的几种操作方式小结

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。先介绍基础的辅助函数,主要用于获取html并输入解析后的结束#把传递解析函数,便于下面的修改def get_html(url, paraser=bs4_paraser):headers = {'Accept': '*/*','Accept-Encoding': 'gzip, deflate, sdch','Accept...

weixin_39607620的博客 157

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

华为设备有关用户名密码的策略配置

命令用来开启对密码进行复杂度检查功能,设备默认已经是开启状态。1、密码长度大于等于12位,含数字大小写字母和特殊符号。2、设置密码更换周期为90天。取值范围8-16,默认长度为8位。登录失败后锁定时间大于15分钟。3、登录失败次数小于5次。4、登录超时30分钟以内。

简单的创作,希望可以帮助到跟我一样的学习者! 7840

解析html几种方式,Python解析html的几种操作方式

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。先介绍基础的辅助函数,主要用于获取html并输入解析后的结束#把传递解析函数,便于下面的修改def get_html(url, paraser=bs4_paraser):headers = {'Accept': '*/*','Accept-Encoding': 'gzip, deflate, sdch','Accept...

weixin_29619665的博客 2025

手把手教你用Python分析OpenFAST仿真结果:pyDatView处理.out文件与数据可视化技巧

本文详细介绍了如何使用Python中的pyDatView工具分析OpenFAST仿真结果,包括数据加载、质量检查、时域与频域分析、多工况对比及自动化报告生成。通过优化技巧和可视化方法,帮助工程师高效处理.out文件,提升风机性能分析的准确性和效率。

weixin_29311017的博客 183

对Python3解析html的几种操作方式小结

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。 先介绍基础的辅助函数,主要用于获取html并输入解析后的结束 #把传递解析函数,便于下面的修改 def get_html(url, paraser=bs4_paraser): headers = { 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN

weixin_51463905的博客 109

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1014

基于matlab的车牌识别(含子程序)

基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname f...

TuTu998的博客 4万+

python中实现网页解析的三种工具分别是_对Python3 解析html的几种操作方式小结

python3 能解析html吗python3爬虫获取HTML文档时的问题。你羡慕小编一身潇洒无牵无挂小编却羡慕你有家有他有人等你回家anaconda环境下python获取一个网站的HTML,不知道为什么获取的为乱码,很正常。控制台支持的编码有限。建议你存到文件再打开看是否正常。 另外页面写了是gbk编码。python3 有几种解码方式了解到, python 3.0.x-3.2.x版用的utf-3...

weixin_42394913的博客 581

2025年微信小程序获取手机号授权登录注册详细教程(含服务端)。不弹窗原因以及减少组件用量的方法

前端把获取到的code传给后端,后端获取access_token和前端传过来的code,请求服务器接口,即可获取到手机号。

coderYYY的博客 3万+

python支持什么操作方式_对Python3 解析html的几种操作方式小结

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。先介绍基础的辅助函数,主要用于获取html并输入解析后的结束#把传递解析函数,便于下面的修改def get_html(url, paraser=bs4_paraser):headers = {'Accept': '*/*','Accept-Encoding': 'gzip, deflate, sdch','Accept...

weixin_39634876的博客 83

Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)

最后更新:2026年2月适用系统:Ubuntu 22.04 LTS(Jammy) / Ubuntu 24.04 LTS(Noble)适用架构:x86_64 / arm64(包括树莓派)

2401_84116277的博客 6011

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

对Python3 解析html的几种操作方式小结

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。 先介绍基础的辅助函数,主要用于获取html并输入解析后的结束 1,lxml.html的方式进行解析, 2,使用BeautifulSoup,不多说了,大家网上找资料看看 3,使用SGMLParser,主要是通过start、end tag的方式进行了,解析工程比较明朗,但是有点麻烦,而且该案例的场景不...

人生苦短, 还不用Python? 1353

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lxml.html 中几种解析器的区别

lxml.html 中几种解析器的区别 lxml 自2.0版本起有了专门用于处理html的模块lxml.html, 模块中包含几种解析html的方式, 以载入html文档为例: from lxml.html import fromstring, soupparser, html5lib html = 'x=1' a = fromstring(html) b = soupparser.fro

司开星的专栏 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python3 html 解析

来看一段来自糗百的网页文件,文件名为test.html。 <head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="chrome=1,IE=edge" http-equiv="X-UA-Compatible"/> <meta con...

fuchao1的博客 1987

解析 html 的几种操作方式

解析html是爬虫后的重要的一个处理数据的环节。一下记录解析html的几种方式。 先介绍基础的辅助函数,主要用于获取html并输入解析后的结束 #把传递解析函数,便于下面的修改 def get_html(url, paraser=bs4_paraser): headers = { 'Accept': '*/*', 'Accept-Encoding': ...

极客点儿 5576

新手必看:Python 爬虫解析 HTML 的 3 种方式(BeautifulSoup vs lxml vs XPath)

本文介绍了Python爬虫解析HTML的三种常用方法:BeautifulSoup、lxml和XPath。BeautifulSoup语法简单易用,适合新手;lxml基于C语言开发,解析速度快;XPath灵活强大,适合复杂网页。文章通过实例演示了每种方法的安装和使用,并对三者的性能、学习成本等进行了对比。建议新手先用BeautifulSoup入门,再逐步学习XPath,针对不同场景灵活选择。同时提供了解决乱码和标签定位等常见问题的方案。掌握这三种解析方式,能应对绝大多数网页数据提取需求。

weixin_41943766的博客 1246

38.Python从入门到精通—Python3 XML 解析 什么是 XML Python 对 XML 的解析

XML(可扩展标记语言)是一种用于描述数据的标记语言,它可以用于表示各种类型的数据,包括文本、图像、音频、视频等。XML 的语法类似于HTML,但它更加灵活,可以自定义标记,并且不依赖于任何特定的应用程序或操作系统。XML的基本结构由元素、属性和文本组成。元素是标记的基本单位,它由开始标记、结束标记和元素内容组成。属性是用于描述元素的附加信息,它由属性名和属性值组成。文本是元素的内容,可以包含任何类型的数据。XML 可以用于数据交换、配置文件、Web 服务等领域。

weixin_50804299的博客 6377
上一篇: 学习Python一定要知道的在定义变量中的三个特征
下一篇: python 把if 写在一行的两种方式
Python热爱者
博客等级 码龄7年 3053粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值