简介
一个将 HTML 转换为 Markdown 的 Python 库, GitHub
安装方式
pip install markdownify
✅ 特点
基于 BeautifulSoup:
HTML 首先被解析为 DOM 结构,因此能很好地处理嵌套标签和无效 HTML。
高度可定制:
支持自定义标签的转换方式。
可以选择保留或移除特定标签、属性。
支持常见 Markdown 元素:
标题、段落、链接、图片、粗体、斜体、列表、引用、表格(部分支持)等。
适合爬虫/内容迁移等场景:
非常适合将 HTML 页面内容转存为 Markdown 格式,供笔记、博客、Git 库使用。
使用
基本用法
from markdownify import markdownify as md
md( 'Yay GitHub ' )
md( 'Yay GitHub ' , strip= [ 'a' ] )
from markdownify import markdownify as md
md( 'Yay GitHub ' , convert= [ 'b' ] )
from markdownify import MarkdownConverter
def md ( soup, ** options) :
return MarkdownConverter( ** options) . convert_soup( soup)
表格保留html
markdown表格无法处理单元格合并,目前很多系统都是将表格以html格式展示,单元格里的内容转markdown.
from markdownify import MarkdownConverter
class CustomMarkdownConverter ( MarkdownConverter) :
def convert_table ( self, el, text, parent_tags) :
def convert_cell ( cell) :
inner_html = '' . join( str ( child) for child in cell. contents)
value = self. convert( inner_html)
value = re. sub( r'(\s*\n\s*){2,}' , ' ' , value)
value = re. sub( r'!\[(.*?)]\((.*?)\)' , r' ' , value)
return value
def attrs_str ( cell) :
attrs = [ ]
for attr in [ 'colspan' , 'rowspan' ] :
if attr in cell. attrs:
attrs. append( f' { attr} =" { cell[ attr] } "' )
return ' ' + ' ' . join( attrs) if attrs else ''
html_rows = [ ]
for row in el. find_all( 'tr' ) :
html_cells = [ ]
for cell in row. find_all( [ 'th' , 'td' ] ) :
tag = cell. name
attr = attrs_str( cell)
markdown_text = convert_cell( cell)
html_cells. append( f"< { tag} { attr} > { markdown_text} { tag} >" )
html_rows. append( f"{ '' . join( html_cells) } " )
return f"\n\n"
def to_md ( html: str , ** options) :
return CustomMarkdownConverter( ** options) . convert( html)
解析自定义html tag
非标准html标签,可以自定义convert_方法,需要把[]:-
替换成_
,例如ac:image
对应的方法是convert_ac_image
。
from markdownify import MarkdownConverter
class ConfluenceMarkdownConverter ( MarkdownConverter) :
def convert_ac_image ( self, el, text, parent_tags) :
"""
Confluence Image示例
"""
attachment = el. find( 'ri:attachment' )
if attachment and attachment. has_attr( 'ri:filename' ) :
filename = attachment[ 'ri:filename' ]
filename_encoded = urllib. parse. quote( filename)
download_url = f" { self. base_url} /download/attachments/ { self. page_id} / { filename_encoded} "
local_dir = os. path. join( "files" , "images" )
os. makedirs( local_dir, exist_ok= True )
local_path = os. path. join( local_dir, self. sanitize_filename( filename) )
response = requests. get( download_url, headers= self. _make_auth_header( ) )
if response. ok:
with open ( local_path, "wb" ) as f:
f. write( response. content)
return f"\n } )\n"
return ''
附录
Markdownify 支持的选项
strip
要剥离的标签列表。此选项不能与 convert
选项同时使用。
convert
要转换的标签列表。此选项不能与 strip
选项同时使用。
autolinks
一个布尔值,表示当
标签的内容与其 href
相同时,是否使用“自动链接”样式。默认值为 True
。
default_title
一个布尔值,如果链接没有提供标题,则是否将其标题设为 href
。默认值为 False
。
heading_style
定义标题应如何被转换。可选值包括:
ATX
(如 # Heading
)
ATX_CLOSED
(如 # Heading #
)
SETEXT
(如 Heading\n=====
)
UNDERLINED
(是 SETEXT
的别名)
默认值为 UNDERLINED
。
bullets
用于无序列表项的符号集合,可以是字符串、列表或元组。如果只包含一个项目,将用于所有嵌套层级。否则会根据嵌套层级交替使用。默认值为 '*+-'
。
strong_em_symbol
在 Markdown 中,*
和 _
都可以用于加粗或斜体。此选项用于选择其中之一:
sub_symbol
, sup_symbol
定义包围
和
内容的字符。默认值为空字符串,因为这种行为并不标准。你可以使用类似 ~sub~
或 ^sup^
的写法。 如果值以 <
开头并以 >
结尾,会被当作 HTML 标签处理,并在标签后添加 /
,比如使用
生成原始 HTML 子脚本标签。
newline_style
定义如何在 Markdown 中标记换行(
):
SPACES
(默认):两个空格加换行符。
BACKSLASH
:使用 \\n
(反斜杠+换行)替代。虽然非标准,但很多解析器支持并偏好这种方式。
code_language
定义
代码块的默认语言。例如,假如页面中所有代码都是 Python 的,可以设为 'python'
。默认值为 ''
(空字符串),可设为任意字符串。
code_language_callback
用于从
标签中提取语言信息的回调函数,例如从 class
属性中获取语言:
def callback ( el) :
return el[ 'class' ] [ 0 ] if el. has_attr( 'class' ) else None
回调接收一个 BeautifulSoup
元素,返回语言字符串或 None
。默认值为 None
。
escape_asterisks
是否将 *
转义为 \*
。默认值为 True
。设为 False
则不转义。
escape_underscores
是否将 _
转义为 \_
。默认值为 True
。设为 False
则不转义。
escape_misc
是否转义其他在 Markdown 中可能具有特殊含义的符号。默认值为 False
。
keep_inline_images_in
如果图片处于标题或表格单元格中,通常会被转换为其 alt
文本。若希望保留为 Markdown 图片,可将此选项设为允许包含图片的父标签列表,例如 ['td']
。默认值为空列表。
table_infer_header
控制当表格没有显式标题行(没有 或 )时的处理方式。若设为 True
,会将首行当作标题行。默认值为 False
。
wrap
, wrap_width
如果 wrap
为 True
,所有文本段落将在 wrap_width
个字符处换行。默认值为 False
,wrap_width
为 80
。设为 None
可不限制长度。 推荐与 newline_style=BACKSLASH
一起使用,以保留段落中的换行。
strip_document
控制是否在转换后的文档中移除前导/后缀的空行。可选值为:
LSTRIP
:移除开头空行
RSTRIP
:移除结尾空行
STRIP
:同时移除
None
:不移除 默认值为 STRIP
。文档内部的换行不会受影响。
beautiful_soup_parser
指定用于解析 HTML 的 BeautifulSoup 解析器。可以是 html5lib
、lxml
或其他已安装的解析器。默认值为 html.parser
。
所有选项既可以作为 markdownify()
函数的参数传入,也可以在继承自 MarkdownConverter
的子类中通过嵌套 Options
类定义。
confluence文档解析
confluence支持很多宏,这里只实现了code宏的解析。
"""
pip install markdownify
pip install httpx requests
"""
import asyncio
import os
import re
import urllib
from urllib. parse import urljoin
import httpx
import requests
from markdownify import MarkdownConverter
class ConfluenceMarkdownConverter ( MarkdownConverter) :
def __init__ ( self, base_url: str , page_id: int , token: str , ** options) :
"""
将一个confluence页面转成markdown
:param base_url: confluence的域名,如:https://confluence.xxx.com
:param token: confluence的访问token
:param options: markdownify解析相关配置
"""
super ( ) . __init__( ** options)
self. base_url = base_url
self. page_id = page_id
self. token = token
def _make_auth_header ( self) :
return {
'Authorization' : f'Basic { self. token} '
}
@staticmethod
def sanitize_filename ( filename: str ) - > str :
return re. sub( r'[\\/:*?"<>|]' , '_' , filename)
async def load_page_html ( self) :
url = urljoin( self. base_url, f'/rest/api/content/ { self. page_id} ' )
params = { 'expand' : 'body.storage' }
headers = self. _make_auth_header( )
async with httpx. AsyncClient( ) as client:
response = await client. get( url, headers= headers, params= params)
response. raise_for_status( )
data = response. json( )
return data[ 'body' ] [ 'storage' ] [ 'value' ]
def convert_table ( self, el, text, parent_tags) :
def convert_cell ( cell) :
inner_html = '' . join( str ( child) for child in cell. contents)
value = self. convert( inner_html)
value = re. sub( r'(\s*\n\s*){2,}' , ' ' , value)
value = re. sub( r'!\[(.*?)]\((.*?)\)' , r' ' , value)
return value
def attrs_str ( cell) :
attrs = [ ]
for attr in [ 'colspan' , 'rowspan' ] :
if attr in cell. attrs:
attrs. append( f' { attr} =" { cell[ attr] } "' )
return ' ' + ' ' . join( attrs) if attrs else ''
html_rows = [ ]
for row in el. find_all( 'tr' ) :
html_cells = [ ]
for cell in row. find_all( [ 'th' , 'td' ] ) :
tag = cell. name
attr = attrs_str( cell)
markdown_text = convert_cell( cell)
html_cells. append( f"< { tag} { attr} > { markdown_text} { tag} >" )
html_rows. append( f"{ '' . join( html_cells) } " )
return f"\n\n"
def convert_ac_image ( self, el, text, parent_tags) :
"""
Confluence Image示例
"""
attachment = el. find( 'ri:attachment' )
if attachment and attachment. has_attr( 'ri:filename' ) :
filename = attachment[ 'ri:filename' ]
filename_encoded = urllib. parse. quote( filename)
download_url = f" { self. base_url} /download/attachments/ { self. page_id} / { filename_encoded} "
local_dir = os. path. join( "files" , "images" )
os. makedirs( local_dir, exist_ok= True )
local_path = os. path. join( local_dir, self. sanitize_filename( filename) )
response = requests. get( download_url, headers= self. _make_auth_header( ) )
if response. ok:
with open ( local_path, "wb" ) as f:
f. write( response. content)
return f"\n } )\n"
return ''
def convert_ac_structured_macro ( self, el, text, parent_tags) :
if el. get( "ac:name" ) == "code" :
lang_el = el. find( "ac:parameter" , { "ac:name" : "language" } )
lang = lang_el. text. strip( ) if lang_el else ""
code_el = el. find( "ac:plain-text-body" )
if code_el:
code_text = code_el. text or ""
code_text = code_text. strip( )
return f"\n``` { lang} \n { code_text} \n```\n"
else :
print ( f'unknown marco name: { el. get( "ac:name" ) } ' )
return ''
async def to_md ( self) :
html = await self. load_page_html( )
return await asyncio. to_thread( self. convert, html)
if __name__ == '__main__' :
convertor = ConfluenceMarkdownConverter( base_url= 'https://confluence.demo.com' , page_id= 123 , token= os. environ. get( 'token' ) )
md = asyncio. run( convertor. to_md( ) )
with open ( 'files/confluence_demo.md' , 'wb' ) as f:
f. write( md. encode( 'utf-8' ) )
你可能感兴趣的:(html转markdown)
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
MotionLCM 部署优化 踩坑解决bug
AI算法网奇
aigc与数字人 深度学习宝典 文生motion
目录依赖项windowstorchok:渲染黑白图问题解决:humanml3d:sentence-t5-large下载数据:报错:Nomodulenamed'sentence_transformers'继续报错:fromtransformers.integrationsimportCodeCarbonCallback解决方法:推理相关转mesh:module‘matplotlib.cm‘hasno
SpringMVC的执行流程
1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,
《路远连着天》 第二 章 在 路 上 7
亚宁
大路镇的街道两旁尽是店铺,气派者是红门柱子雕花门窗,一般则多为布匹小百货店,还有几家门面朝外的车马大店,和一家颇有气势的典当铺。街上来往人还真不少,有挑担叫卖水果的,有背篓子路过的,还有衣冠楚楚,悠哉悠哉,甩着双手散步的有钱爷。耿六想着先寻姑妈家,还是先到兵营看那几个土匪呢?也只是一转念,他选择了后者,跟在几个闲人后,就来到了在镇外山头上曾看到过的那处飘着晴天白日旗的兵营门外。这里,围观的人乱哄哄
Selenium 特殊控件操作与 ActionChains 实践详解
小馋喵知识杂货铺
selenium 测试工具
1.下拉框单选操作(a)使用SeleniumSelect类(标准HTML标签)Selenium提供了内置的Select类用于操作标准下拉框,这种方式简单且直观。fromselenium.webdriver.support.uiimportSelect#定位下拉框dropdown=Select(driver.find_element("id","dropdown_id"))#通过以下三种方式选择单个
微信公众号回调java_处理微信公众号消息回调
weixin_39607620
微信公众号回调java
1、背景在上一节中,咱们知道如何接入微信公众号,可是以后公众号会与咱们进行交互,那么微信公众号如何通知到咱们本身的服务器呢?咱们知道咱们接入的时候提供的url是GET/mp/entry,那么公众号以后产生的事件将会以POST/mp/entry发送到咱们本身的服务器上。html2、代码实现,此处仍是使用weixin-java-mp这个框架实现一、引入weixin-java-mpcom.github.
旋转
安静的影子
图片发自App傍晚你带我们去万象城说是试营业到了大厦底下好家伙这么壮观我望向楼顶直达蓝天白云啊整个大楼似乎在转圈我蒙了又很奇妙的感觉我透过大厦望天空就感觉到在旋转真的感觉到动态的效果很神奇我慌忙叫你看快看快看大厦好像会旋转你说我知道知道知道也不知道你是否感觉到了真的很美妙的体会是天空在转吗我感觉大厦也在旋转很美妙很美妙图片发自App图片发自App
人工智能应用研究快讯 2021-11-30
峰谷皆平
[HTML]ArtificialIntelligenceforSkinCancerDetection:ScopingReviewATakiddin,JSchneider,YYang,AAbd-Alrazaq...JournalofMedicalInternet...,2021ABSTACT:Background:Skincanceristhemostcommoncancertypeaffectin
中原焦点团队党秀丽分享276天,约练268次,5月29日,周五
润物无声dang
第十二次课,答疑解惑。1.咨询约练过程中遇到来访者上来就说想处理情绪,可是聊的过程中他又不想具体聊他的情绪怎么产生的,多久了,就是希望用外化技术处理他的情绪,我除了好奇是什么让他希望用外化呢,也用阳谋告诉他,外化前也是需要具体的聊聊这个情绪的,还可以怎么做呢?给他安全感这一块大概怎么做呢?不想具体说有他的道理,聊聊情绪大概是什么事儿?专业的认识,专业度的认可。不带功利心,转介几次的不太好,信任程度
【Jupyter】个人开发常见命令
TIM老师
# Pycharm & VSCode python Jupyter
1.查看python版本importsysprint(sys.version)2.ipynb/py文件转换jupyternbconvert--topythonmy_file.ipynbipynb转换为mdjupyternbconvert--tomdmy_file.ipynbipynb转为htmljupyternbconvert--tohtmlmy_file.ipynbipython转换为pdfju
用代码生成艺术字:设计个性化海报的秘密
本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准
前端面试每日 3+1 —— 第39天
浪子神剑
今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss
GDP经济社会人文民生栅格数据下载网站汇总
疯狂学习GIS
本文为“GIS数据获取整理”专栏(https://blog.csdn.net/zhebushibiaoshifu/category_10857546.html)中第八篇独立博客,因此本文全部标题均由“8”开头。本文对目前主要的GDP、社会与经济数据获取网站加以整理与介绍,若需其它GIS领域数据(如遥感影像数据、气象数据、土地土壤数据、农业数据等),大家可以点击上方专栏查看,也可以看这一篇汇总文
感赏客户
一克拉燕子
1,我感赏每次能吸引轻微的客户!一两瓶帮他们调理好!2,我感赏我的每一个客户用好了后都热心帮我介绍!3,我感赏每个镇上都能遇到客户转代理!5,我感赏附近有疼痛的人都主动加我!6,我感赏每天都有人主动找我做代理!7,我感赏以前体验过的客户都找我卖产品!8,我感赏我的团队越来越大!100人!9,我感赏团队每个人都是销售精英!都是积极主动,好学!10,我感赏以前咨询过我的人都来跟我代理可暖!11,我感赏
【MySQL】MySQL数据库如何改名
武昌库里写JAVA
面试题汇总与解析 spring boot vue.js sql java 学习
MySQL建库授权语句https://www.jianshu.com/p/2237a9649ceeMySQL数据库改名的三种方法https://www.cnblogs.com/gomysql/p/3584881.htmlMySQL安全修改数据库名几种方法https://blog.csdn.net/haiross/article/details/51282417MySQL重命名数据库https://
如何纠正过度养育,将孩子培养成合格的成年人呢?
陌语啊
有些家长在孩子的成长过程中发现,自己对孩子的养育出现了问题。父母每天围着孩子转,孩子觉得应该的;家务活不会干,自己的东西总是找不到;娇蛮任性,动不动就对父母大喊大叫;性格孤僻,不愿结识朋友,整天与游戏为伴等。其实,这是过度养育的后果,那么我们改如何改正呢?作为父母,我们首先要思考一下孩子为什么会变成这样,是他们天性如此吗?显然不是,孩子刚出生时就是一张白纸,需要我们经过后天培养的。那么孩子出现一些
word转pdf、pdf转word在线工具分享
bpmh
常用工具 word pdf
️一、在线转换网站(方便快捷,无需安装)MicrosoftOfficeOnline(官方推荐,最安全可靠):网址:直接使用你的Microsoft账户登录https://www.office.com/方法:将你的.docx或.doc文件上传到OneDrive。在OfficeOnline中打开该Word文档。点击文件>另存为>下载PDF副本。优点:官方出品,完全免费,无需额外上传到第三方服务器,安全性
探索高效文档转换新路径:Aspose.Words v18.7助力Word无缝变PDF
邴卉露Robust
探索高效文档转换新路径:Aspose.Wordsv18.7助力Word无缝变PDF【下载地址】Aspose.Wordsv18.7C示例源码Word转PDF无需安装Office本仓库提供了一个使用Aspose.Wordsv18.7将Word文档转换为PDF文档的C#示例源码。Aspose.Words是一个强大的.NET控件,允许开发者在不安装MicrosoftOffice的情况下读写Word文档,并
PDF转Markdown - Python 实现方案与代码
Eiceblue
Python Python PDF pdf python 开发语言 vscode
PDF作为广泛使用的文档格式,转换为轻量级标记语言Markdown后,可无缝集成到技术文档、博客平台和版本控制系统中,提高内容的可编辑性和可访问性。本文将详细介绍如何使用国产Spire.PDFforPython库将PDF文档转换为Markdown格式。技术优势:精准保留原始文档结构(段落/列表/表格)完整提取文本和图像内容无需Adobe依赖的纯Python实现支持Linux/Windows/mac
移动端适配rem方案
简单的码农
1.rem+动态html的font-size1.rem单位是相对于html元素的font-size来设置的,那么如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的font-size尺寸。2.比如如下案例:设置一个盒子的宽度是2rem;设置不同的屏幕上html的font-size不同;image这样在开发中,我们只需要考虑两个问题:问题一:针对不同的屏幕,设置html不同的font-s
Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录
二倍速播放
前端 vue.js
1.迁移动机与技术选型1.1CSR架构的局限性基于Vue3和Vite构建的客户端渲染(CSR)单页应用(SPA)提供了良好的开发体验和用户交互流畅性。但是其核心局限在于:搜索引擎优化(SEO):初始HTML响应仅包含一个根div元素,实际内容由JavaScript在浏览器端动态生成。虽然主流搜索引擎(如Google)能够执行部分JavaScript,但其抓取效率和稳定性不如直接获取完整HTML。非
redis反弹shell时kali无法接收回弹的解决方法
显哥无敌
shell redis
无法接受回谈大概率是bash命令写的不对,那个crontab中间的星号个数是有意义的,不是随便加的,下面贴一下crontab的基本用法https://www.cnblogs.com/zhoading/p/11572630.html{minute}{hour}{day-of-month}{month}{day-of-week}{full-path-to-shell-script}如果是要cronta
看图写诗No235 假如生活欺骗了你 不要忧郁 也不要愤慨 短诗:只要
环球慢旅程
只要我知道你在寻找爱的解药一颗心千疮百孔风吹过落雪无痕生活总是琢磨不透爱的路上总是百转千回天空不会永远是灰色你看希望似春天的花蕾在角落里绽放只要相信爱是生命中最大的奇迹时间的手里捧着治愈一切伤痛的解药只要耐心等待世间所有的色彩都会回来———环球慢旅程2020年12月28日关于“只要”这首诗的一点说明,怎么也不会想到,2020年会是这样可怕,2021年马上就要开始,看着欧洲愈演愈烈的疫情,真的是不知
第六十七章 受刑
一指弹江南
黑影从床边直起了身子,我朝他一瞧,个头不高,还是个驼子,心里顿时一跳,难道真是疤脸?我想动身子,却发现身子居然已经给捆的结结实实,感觉全身上下都给捆上了。黑影这时候一转身,从他那里传来“吧嗒”一声,房间里顿时有了光亮,借着光亮我朝那黑影一看,脑袋当即“嗡”了一声,完了,彻底完了,躲躲藏藏提心吊胆这么些天,还是没能躲过去,心一下子沉到了谷底,不知道接下来该咋办了。房间里这条黑影,正是疤脸,这时候他一
native.js设置可缩放的webview并隐藏缩放控件
Nanayai
需求明确:webview页面可以手指缩放,并且不要那个原生控件;实现思路:1.使用h5+封装好的方法:设置scalable属性,并在html中设置meta标签:user-scalable=yes或不设置,minimum-scale和maximum-scale需要注意不要都设为1:mui.openWindow({url:"someThing",id:"someThing",styles:{scala
Redis反弹Shell
波吉爱睡觉
web安全 #未授权访问漏洞 #SSRF redis 网络安全 web安全
这里我来总结几种Redis反弹Shell的方法一、利用Redis写WebShell前提条件开了web服务器,并且知道路径,还需要有文件读写增删改查的权限条件比较苛刻,但是满足条件上传就会简单一点,我们直接将文件写入www目录下,完了使用工具连接即可。语句:redis:6379>configsetdir/var/www/html/redis:6379>configsetdbfilenameshell
Windows下Oracle安装图解
叫我老村长
Windows下Oracle安装图解----oracle-win-64-11g详细安装步骤一、Oracle下载官方下地址http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.htmlwin32位操作系统下载地址:http://download.oracle.com/otn/nt/oracle11g
震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!
coding随想
JavaScript 前端 javascript html5
一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入
11. HTML 中 DOCTYPE 的作用
yqcoder
前端面试-CSS html 前端
总结H5的声明HTML5的DOCTYPE声明HTML5中的声明用于告诉浏览器当前文档使用的是HTML5的文档类型。它必须是文档中的第一行内容(在任何HTML标签之前),以确保浏览器能够正确地解析和渲染页面。DOCTYPE的作用触发标准模式:DOCTYPE声明的主要作用是让浏览器以标准模式(StandardsMode)来解析和渲染页面,而不是以兼容模式(QuirksMode)。兼容性:在没有DOCT
从0到1学PHP(一):PHP 基础入门:开启后端开发之旅
目录一、PHP简介与发展历程1.1PHP定义与特点1.2在后端开发中的地位1.3发展阶段及重要版本更新二、PHP开发环境搭建2.1Windows系统下搭建步骤2.2Mac系统下搭建方法及常用工具2.3适合初学者的集成开发环境三、第一个PHP程序3.1编写"HelloWorld"程序3.2程序基本结构和执行过程3.3PHP代码的嵌入方式(在HTML中)一、PHP简介与发展历程1.1PHP定义与特点P
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓