婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解

基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解

熱門標簽:深圳400電話辦理那家好 襄陽房產(chǎn)電銷機器人招商 安徽移動外呼系統(tǒng) 百度地圖標注名編輯 怎么在高德地圖標注行走軌跡 百度地圖標注飯店位置怎么 施工地圖標注怎么做 清遠陽山400電話號碼如何申請 個性化地圖標注在線

1,使用xpath清理不必要的標簽元素,以及無內(nèi)容標簽

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)
 
    # 常規(guī)刪除操作,不需要的標簽刪除
    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標簽,是否有內(nèi)容存在,沒有的直接刪除
    for p in selector.xpath(f"http://*[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,正則表達清理空格以及換行符內(nèi)容

#!/usr/bin/env python
# -*-coding:utf-8-*-
 
import re  
 
def regular_clean(self, str1: str, str2: str):
    '''
    正則表達式處理數(shù)據(jù)格式
    :param str1: content
    :param str2: html_content
    :return: 返回處理后的結(jié)果
    '''
 
    def new_line(text):
      text = re.sub('br\s?/?>', 'br>', text)
      text = re.sub(
        '/?a>|/?em>|/?html>|/?body>|'
        '/?head>|[a-zA-Z]{1,10}\s?/>|'
        '/?strong>|/?blockquote>|/?b>|'
        '/?span>|/?i>|/?hr>|/?font>',
        '',
        text)
      text = re.sub('\n', '', text)
      text = re.sub('h[1-6]>', 'p>', text)
      text = re.sub('/h[1-6]>', '/p>', text)
      text = text.replace('/p>', '/p>\n').replace('br>', 'br/>')
      return text
 
    str1, str2 = self.clean_blank(str1), self.clean_blank(str2) # TODO 處理空白行問題
 
    # TODO html_content處理 1,刪除多余的無法使用的標簽以及影響數(shù)據(jù)展示的標簽 2,換行符問題處理以及更換
 
    str2 = new_line(text=str2)
 
    return str1, str2

結(jié)尾部分,各個方法封裝類代碼展示

#!/usr/bin/env python
# -*-coding:utf-8-*-
'''
author: szhan
date:2020-08-17
summery: 清理html_conent以及獲取純凈數(shù)據(jù)格式
'''
 
import re
from lxml import etree
from pyquery import PyQuery as pq
from 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('#13;', '').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處理具體細節(jié)方面
    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)
 
    # 常規(guī)刪除操作,不需要的標簽刪除
    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標簽,是否有內(nèi)容存在,沒有的直接刪除
    for p in selector.xpath(f"http://*[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):
    '''
    正則表達式處理數(shù)據(jù)格式
    :param str1: content
    :param str2: html_content
    :return: 返回處理后的結(jié)果
    '''
 
    def new_line(text):
      text = re.sub('br\s?/?>', 'br>', text)
      text = re.sub(
        '/?a>|/?em>|/?html>|/?body>|'
        '/?head>|[a-zA-Z]{1,10}\s?/>|'
        '/?strong>|/?blockquote>|/?b>|'
        '/?span>|/?i>|/?hr>|/?font>',
        '',
        text)
      text = re.sub('\n', '', text)
      text = re.sub('h[1-6]>', 'p>', text)
      text = re.sub('/h[1-6]>', '/p>', text)
      text = text.replace('/p>', '/p>\n').replace('br>', 'br/>')
      return text
 
    str1, str2 = self.clean_blank(str1), self.clean_blank(str2) # TODO 處理空白行問題
 
    # TODO html_content處理 1,刪除多余的無法使用的標簽以及影響數(shù)據(jù)展示的標簽 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)

總結(jié)

到此這篇關(guān)于基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解的文章就介紹到這了,更多相關(guān)PyQuery、正則表達式的格式清理工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • JQuery 選擇器 xpath 語法應(yīng)用
  • Python利用Xpath選擇器爬取京東網(wǎng)商品信息
  • Python爬蟲PyQuery庫基本用法入門教程
  • Python中的jquery PyQuery庫使用小結(jié)
  • python解析html開發(fā)庫pyquery使用方法
  • python使用urllib模塊和pyquery實現(xiàn)阿里巴巴排名查詢
  • javascript中使用正則表達式清理table樣式的代碼

標簽:延邊 臨夏 中衛(wèi) 阜陽 黑河 駐馬店 欽州 南昌

巨人網(wǎng)絡(luò)通訊聲明:本文標題《基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解》,本文關(guān)鍵詞  基于,xpath,選擇器,PyQuery,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于xpath選擇器、PyQuery、正則表達式的格式清理工具詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本精品一级二级| 欧美日韩精品免费| 国产日韩欧美电影| 欧美亚洲国产怡红院影院| 久久国产精品无码网站| 一区二区久久久久久| 欧美激情一区不卡| 久久综合视频网| 日韩美女在线视频 | 看电视剧不卡顿的网站| 亚洲综合视频网| 亚洲人成精品久久久久| 国产精品成人免费在线| 亚洲国产精品黑人久久久| 久久嫩草精品久久久精品| 精品久久五月天| 久久免费美女视频| 国产视频在线观看一区二区三区| 精品欧美一区二区久久| 久久久精品黄色| 久久久久国产精品厨房| 日本一区二区三区免费乱视频| 久久久亚洲高清| 久久久久久**毛片大全| 久久久天堂av| 午夜精品一区在线观看| 亚洲一区二区三区四区五区中文| 亚洲一区二区成人在线观看| 一区二区三区四区中文字幕| 亚洲成人你懂的| 天堂va蜜桃一区二区三区| 全部av―极品视觉盛宴亚洲| 精品影视av免费| 成人妖精视频yjsp地址| 色综合一个色综合| 欧美视频日韩视频在线观看| 欧美一区二区三区免费| 精品免费日韩av| 中文字幕第一区二区| 亚洲精品视频在线看| 亚洲国产成人av好男人在线观看| 午夜伦理一区二区| 午夜激情一区二区三区| 国模少妇一区二区三区| 成人免费视频国产在线观看| 在线观看一区二区精品视频| 日韩欧美在线123| 亚洲天堂2016| 成人性生交大片免费看中文| 欧美一区二区三区免费观看视频| 中文字幕欧美激情一区| 捆绑变态av一区二区三区| 欧美色老头old∨ideo| 一区二区三区中文字幕在线观看| 狠狠色狠狠色综合日日91app| 欧美色图激情小说| 国产精品欧美一级免费| 国产一区二区三区综合| 99免费精品在线| 国产日韩欧美高清在线| 国产精品色呦呦| 国产亚洲成年网址在线观看| 高清不卡一二三区| 91超碰这里只有精品国产| 日本va欧美va瓶| 不卡视频在线看| 国产精品一区二区在线看| 精品国产一二三| 中文字幕中文字幕一区| 奇米影视在线99精品| 色综合天天综合网天天狠天天| 秋霞午夜av一区二区三区| 2017欧美狠狠色| 激情另类小说区图片区视频区| 欧美性猛交xxxx黑人交| 亚洲综合色丁香婷婷六月图片| 色女孩综合影院| 国内成人精品2018免费看| 91美女福利视频| 亚洲视频精选在线| 91精品欧美久久久久久动漫| 亚洲妇熟xx妇色黄| 日韩免费性生活视频播放| 国产精品久久免费看| 制服丝袜av成人在线看| 亚洲精品视频免费看| 成人精品在线视频观看| 久久综合999| 麻豆91精品91久久久的内涵| 欧美乱妇一区二区三区不卡视频| 国产视频视频一区| 美女视频黄免费的久久 | 久久久欧美精品sm网站| 日本亚洲最大的色成网站www| 欧美在线啊v一区| 亚洲一区二区三区四区在线| 精品国产免费久久| 日本不卡中文字幕| 欧美不卡一区二区三区四区| 日韩精品一二三四| 88在线观看91蜜桃国自产| 亚洲国产精品视频| 884aa四虎影成人精品一区| 石原莉奈在线亚洲二区| 日韩一区二区三区观看| 国产一区激情在线| 久久久精品免费网站| 99精品久久只有精品| 亚洲国产裸拍裸体视频在线观看乱了| 在线欧美小视频| 蜜乳av一区二区| 久久久久久一级片| 粉嫩欧美一区二区三区高清影视| 国产片一区二区三区| av福利精品导航| 夜夜操天天操亚洲| 精品福利一二区| 成人深夜视频在线观看| 日韩美女精品在线| 欧美日韩久久不卡| 国产乱码一区二区三区| 亚洲柠檬福利资源导航| 欧美老年两性高潮| 国精产品一区一区三区mba视频| 欧美激情一区二区三区不卡 | 一区二区三区美女视频| 久久精品亚洲精品国产欧美kt∨ | 精品国产sm最大网站免费看| 欧美成人国产一区二区| 国产日产欧产精品推荐色| 中文字幕av一区二区三区高| 亚洲精品成人天堂一二三| 美女久久久精品| 欧美日韩免费一区二区三区视频| 欧美精品久久久久久久久老牛影院| 4438x亚洲最大成人网| 久久综合久久久久88| 亚洲另类春色校园小说| 亚洲国产裸拍裸体视频在线观看乱了 | 天堂久久一区二区三区| 五月激情六月综合| 日韩一区二区麻豆国产| 欧美tickling网站挠脚心| 亚洲国产一区二区三区| 色屁屁一区二区| 人人狠狠综合久久亚洲| 亚洲视频你懂的| 欧美成人a视频| 日本道色综合久久| 国产一区二区在线影院| 亚洲自拍偷拍麻豆| 久久人人97超碰com| 欧美精品久久一区| 亚洲另类在线制服丝袜| 91色婷婷久久久久合中文| 日韩精品专区在线| 日韩av午夜在线观看| 欧美一区二区在线免费播放| 欧美国产乱子伦| 激情成人午夜视频| 日韩精品在线网站| 日本成人在线看| 日韩精品一区二区三区视频在线观看| 亚洲乱码中文字幕综合| 日韩欧美中文一区二区| 综合av第一页| 日本一区二区三区四区在线视频| 欧美一区二区日韩一区二区| 日本强好片久久久久久aaa| 亚洲黄色尤物视频| 中文字幕一区av| 亚洲色图在线看| 成人免费在线播放视频| 久久久久久久久岛国免费| 精品国产91乱码一区二区三区| 欧美影院午夜播放| 色哟哟国产精品| 91久久精品日日躁夜夜躁欧美| 99在线精品一区二区三区| 国产不卡免费视频| 成人毛片老司机大片| 国产成人超碰人人澡人人澡| 国产成人亚洲精品狼色在线| 国产一区欧美日韩| 波多野结衣亚洲| 色婷婷亚洲精品| 91福利视频网站| 欧美又粗又大又爽| 欧美日韩在线三级| 欧美一区二区在线视频| 精品电影一区二区| 亚洲国产精品激情在线观看| 亚洲免费在线观看| 亚洲国产精品麻豆| 老司机精品视频导航| 国产成人高清视频| 色综合色狠狠天天综合色| 欧美日韩一二三| 欧美变态tickling挠脚心| 国产欧美日韩在线看|