千家信息网

基于xpath选择器、PyQuery、正则表达式格式清理工具的示例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关基于xpath选择器、PyQuery、正则表达式格式清理工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1,使用xpath清理不必要的
千家信息网最后更新 2026年11月03日基于xpath选择器、PyQuery、正则表达式格式清理工具的示例分析

这篇文章给大家分享的是有关基于xpath选择器、PyQuery、正则表达式格式清理工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1,使用xpath清理不必要的标签元素,以及无内容标签

from lxml import etree def xpath_clean(self, text: str, xpath_dict: dict) -> str:    '''    xpath 清除不必要的元素    :param text: html_content    :param xpath_dict: 清除目标xpath    :return: string type html_content    '''    remove_by_xpath = xpath_dict if xpath_dict else dict()     # 必然清除的项目 除非极端情况 一般这些都是要清除的    remove_by_xpath.update({      '_remove_2': '//iframe',      '_remove_4': '//button',      '_remove_5': '//form',      '_remove_6': '//input',      '_remove_7': '//select',      '_remove_8': '//option',      '_remove_9': '//textarea',      '_remove_10': '//figure',      '_remove_11': '//figcaption',      '_remove_12': '//frame',      '_remove_13': '//video',      '_remove_14': '//script',      '_remove_15': '//style'    })     parser = etree.HTMLParser(remove_blank_text=True, remove_comments=True)    selector = etree.HTML(text, parser=parser)     # 常规删除操作,不需要的标签删除    for xpath in remove_by_xpath.values():      for bad in selector.xpath(xpath):        bad_string = etree.tostring(bad, encoding='utf-8',                      pretty_print=True).decode()        logger.debug(f"clean article content : {bad_string}")        bad.getparent().remove(bad)     skip_tip = "name()='img' or name()='tr' or " \          "name()='th' or name()='tbody' or " \          "name()='thead' or name()='table'"    # 判断所有p标签,是否有内容存在,没有的直接删除    for p in selector.xpath(f"//*[not({skip_tip})]"):      # 跳过逻辑      if p.xpath(f".//*[{skip_tip}]") or \          bool(re.sub('\s', '', p.xpath('string(.)'))):        continue       bad_p = etree.tostring(p, encoding='utf-8',                  pretty_print=True).decode()      logger.debug(f"clean p tag : {bad_p}")      p.getparent().remove(p)     return etree.tostring(selector, encoding='utf-8',               pretty_print=True).decode()

2,使用pyquery清理标签属性,并返回处理后源码和纯净文本

#!/usr/bin/env python# -*-coding:utf-8-*- from pyquery import PyQuery as pq def pyquery_clean(self, text, url, pq_dict) -> object:    '''    pyquery 做出必要的处理,    :param text:    :param url:    :param pq_dict:    :return:    '''    # 删除pq表达式字典    remove_by_pq = pq_dict if pq_dict else dict()    # 标签属性白名单    attr_white_list = ['rowspan', 'colspan']    # 图片链接key    img_key_list = ['src', 'data-echo', 'data-src', 'data-original']    # 生成pyquery对象    dom = pq(text)     # 删除无用标签    for bad_tag in remove_by_pq.values():      for bad in dom(bad_tag):        bad_string = pq(bad).html()        logger.debug(f"clean article content : {bad_string}")      dom.remove(bad_tag)     # 标签各个属性处理    for tag in dom('*'):      for key, value in tag.attrib.items():        # 跳过逻辑,保留表格的rowspan和colspan属性        if key in attr_white_list:          continue        # 处理图片链接,不完整url,补充完整后替换        if key in img_key_list:          img_url = self.absolute_url(url, value)          pq(tag).remove_attr(key)          pq(tag).attr('src', img_url)          pq(tag).attr('alt', '')        # img标签的alt属性保留为空        elif key == 'alt':          pq(tag).attr(key, '')        # 其余所有属性做删除操作        else:          pq(tag).remove_attr(key)     return dom.text(), dom.html()

3,正则表达清理空格以及换行符内容

#!/usr/bin/env python# -*-coding:utf-8-*- import re   def regular_clean(self, str1: str, str2: str):    '''    正则表达式处理数据格式    :param str1: content    :param str2: html_content    :return: 返回处理后的结果    '''     def new_line(text):      text = re.sub('', '
', text) text = re.sub( '||||' '|<[a-zA-Z]{1,10}\s?/>|' '|||' '|||', '', text) text = re.sub('\n', '', text) text = re.sub('', '

', text) text = re.sub('', '

', text) text = text.replace('

', '

\n').replace('
', '
') return text str1, str2 = self.clean_blank(str1), self.clean_blank(str2) # TODO 处理空白行问题 # TODO html_content处理 1,删除多余的无法使用的标签以及影响数据展示的标签 2,换行符问题处理以及更换 str2 = new_line(text=str2) return str1, str2

结尾部分,各个方法封装类代码展示

#!/usr/bin/env python# -*-coding:utf-8-*-'''author: szhandate:2020-08-17summery: 清理html_conent以及获取纯净数据格式''' import refrom lxml import etreefrom pyquery import PyQuery as pqfrom urllib.parse import urlsplit, urljoin from loguru import logger  class CleanArticle:   def __init__(      self,      text: str,      url: str = '',      xpath_dict: dict = None,      pq_dict: dict = None  ):    self.text = text    self.url = url    self.xpath_dict = xpath_dict or dict()    self.pq_dict = pq_dict or dict()   @staticmethod  def absolute_url(baseurl: str, url: str) -> str:    '''    补充url    :param baseurl:scheme url    :param url: target url    :return: complete url    '''    target_url = url if urlsplit(url).scheme else urljoin(baseurl, url)    return target_url   @staticmethod  def clean_blank(text):    '''    空白处理    :param text:    :return:    '''    text = text.replace('
', '').replace('\u3000', '').replace('\t', '').replace('\xa0', '')    text = re.sub('\s{2,}', '', text)    text = re.sub('\n{2,}', '\n', text)    text = text.strip('\n').strip()    return text   def run(self):    '''    :return:处理后的content, html_content    '''    if (not bool(self.text)) or (not isinstance(self.text, str)):      raise ValueError('html_content has a bad type value')    # 首先,使用xpath去除空格,以及注释,iframe, button, form, script, style, video等标签    text = self.xpath_clean(self.text, self.xpath_dict)     # 第二步,使用pyquery处理具体细节方面    str1, str2 = self.pyquery_clean(text, self.url, self.pq_dict)     # 最终的正则处理    content, html_content = self.regular_clean(str1, str2)     return content, html_content   def xpath_clean(self, text: str, xpath_dict: dict) -> str:    '''    xpath 清除不必要的元素    :param text: html_content    :param xpath_dict: 清除目标xpath    :return: string type html_content    '''    remove_by_xpath = xpath_dict if xpath_dict else dict()     # 必然清除的项目 除非极端情况 一般这些都是要清除的    remove_by_xpath.update({      '_remove_2': '//iframe',      '_remove_4': '//button',      '_remove_5': '//form',      '_remove_6': '//input',      '_remove_7': '//select',      '_remove_8': '//option',      '_remove_9': '//textarea',      '_remove_10': '//figure',      '_remove_11': '//figcaption',      '_remove_12': '//frame',      '_remove_13': '//video',      '_remove_14': '//script',      '_remove_15': '//style'    })     parser = etree.HTMLParser(remove_blank_text=True, remove_comments=True)    selector = etree.HTML(text, parser=parser)     # 常规删除操作,不需要的标签删除    for xpath in remove_by_xpath.values():      for bad in selector.xpath(xpath):        bad_string = etree.tostring(bad, encoding='utf-8',                      pretty_print=True).decode()        logger.debug(f"clean article content : {bad_string}")        bad.getparent().remove(bad)     skip_tip = "name()='img' or name()='tr' or " \          "name()='th' or name()='tbody' or " \          "name()='thead' or name()='table'"    # 判断所有p标签,是否有内容存在,没有的直接删除    for p in selector.xpath(f"//*[not({skip_tip})]"):      # 跳过逻辑      if p.xpath(f".//*[{skip_tip}]") or \          bool(re.sub('\s', '', p.xpath('string(.)'))):        continue       bad_p = etree.tostring(p, encoding='utf-8',                  pretty_print=True).decode()      logger.debug(f"clean p tag : {bad_p}")      p.getparent().remove(p)     return etree.tostring(selector, encoding='utf-8',               pretty_print=True).decode()   def pyquery_clean(self, text, url, pq_dict) -> object:    '''    pyquery 做出必要的处理,    :param text:    :param url:    :param pq_dict:    :return:    '''    # 删除pq表达式字典    remove_by_pq = pq_dict if pq_dict else dict()    # 标签属性白名单    attr_white_list = ['rowspan', 'colspan']    # 图片链接key    img_key_list = ['src', 'data-echo', 'data-src', 'data-original']    # 生成pyquery对象    dom = pq(text)     # 删除无用标签    for bad_tag in remove_by_pq.values():      for bad in dom(bad_tag):        bad_string = pq(bad).html()        logger.debug(f"clean article content : {bad_string}")      dom.remove(bad_tag)     # 标签各个属性处理    for tag in dom('*'):      for key, value in tag.attrib.items():        # 跳过逻辑,保留表格的rowspan和colspan属性        if key in attr_white_list:          continue        # 处理图片链接,不完整url,补充完整后替换        if key in img_key_list:          img_url = self.absolute_url(url, value)          pq(tag).remove_attr(key)          pq(tag).attr('src', img_url)          pq(tag).attr('alt', '')        # img标签的alt属性保留为空        elif key == 'alt':          pq(tag).attr(key, '')        # 其余所有属性做删除操作        else:          pq(tag).remove_attr(key)     return dom.text(), dom.html()   def regular_clean(self, str1: str, str2: str):    '''    正则表达式处理数据格式    :param str1: content    :param str2: html_content    :return: 返回处理后的结果    '''     def new_line(text):      text = re.sub('', '
', text) text = re.sub( '||||' '|<[a-zA-Z]{1,10}\s?/>|' '|||' '|||', '', text) text = re.sub('\n', '', text) text = re.sub('', '

', text) text = re.sub('', '

', text) text = text.replace('

', '

\n').replace('
', '
') return text str1, str2 = self.clean_blank(str1), self.clean_blank(str2) # TODO 处理空白行问题 # TODO html_content处理 1,删除多余的无法使用的标签以及影响数据展示的标签 2,换行符问题处理以及更换 str2 = new_line(text=str2) return str1, str2 if __name__ == '__main__': with open('html_content.html', 'r', encoding='utf-8') as f: lines = f.readlines() html = '' for line in lines: html += line ca = CleanArticle(text=html) _, html_content = ca.run() print(html_content)

感谢各位的阅读!关于"基于xpath选择器、PyQuery、正则表达式格式清理工具的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

处理 标签 属性 正则 表达式 内容 格式 数据 图片 逻辑 链接 问题 元素 换行符 空白 工具 示例 分析 选择 必要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技巨头监管 互联网科技深圳 互联网与科技金融数据 百单互联网科技有限公司 上海致骋互联网科技 互联网科技公司有哪些 国外互联网科技网站 互联网科技股有哪些 金融科技和互联网金融 滨湖区互联网智能科技产品供应 成都仁贤领冠互联网科技有限公司 小米互联网科技园设置 重庆互联网医院沙龙医盟信息科技 崇明区互联网教育科技售后服务 注册互联网科技公司经营范围大全 消费医药和互联网科技 互联网保险科技创业 吉林省码上互联网科技电话 陕西九四连强互联网科技有限公司 美国五大互联网科技公司市值多少 苏州互联网科技贷款公司 四川狮子座互联网科技 深圳市优智互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 浙南科技城互联网大厦建设工程 区块链结合互联网科技 杭州披云加互联网科技有限公司 互联网科技收购价值 北京互联网科技类企业分布 互联网科技企业文化
0