又开始浮躁

作者感到迷茫,不知道自己喜欢什么,也不知道未来的发展方向。看到身边朋友都在不断进步,而自己却似乎在原地踏步,这种对比让作者感到更加焦虑。

 这几天没有做什么事情,又开始浮躁,不知道自己喜欢什么;该往什么方向发展,又在浪费自己的时间。迷茫!

看到自己周围的朋友,同学都或多或少的在进步自己原地踏步却添了不少惆怅,难道我的一生就这样虚度了吗?

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
<think>我们有一个HTML片段,目标是提取其中的文字内容。具体来说,用户提供的HTML片段如下: ```html <div id="chaptercontent" class="Readarea ReadAjax_content">  第1章复仇者<br /><br />  夜晚时分,一座繁华中透露着浮躁的二线城市。<br /><br />  街道上车水马龙,夜生活的开始,让许多年轻人从闷热的房间中逃出,尽情挥霍着时光。<br /><br />  苏晓蹲坐在一栋二层别墅的房顶,夜风吹过,让他感觉到一阵凉爽。<br /> ``` 我们需要提取这个`div`中的所有文本,忽略HTML标签。 ### 使用XPath提取文本 根据引用[1]和引用[2],XPath是一种强大的查询语言,特别适合在HTML文档中定位和提取元素。我们可以使用XPath的`//text()`或`string()`方法来获取文本内容。 #### 方法1:提取所有文本节点(返回列表) 使用XPath表达式:`//div[@id="chaptercontent"]//text()` - 这个表达式会选取`div`元素内所有后代的文本节点,包括空格和换行符(在HTML中可能表现为空白字符)。 #### 方法2:提取整个元素的文本(返回字符串) 使用XPath表达式:`string(//div[@id="chaptercontent"])` - 这个函数会返回该元素内所有文本节点的合并字符串。 ### 步骤(使用Python的lxml库) 1. 解析HTML字符串为Element对象。 2. 应用XPath表达式提取文本。 3. 清理文本(如去除多余空白、合并等)。 ### 示例代码 ```python from lxml import etree # 给定的HTML字符串 html_str = """ <div id="chaptercontent" class="Readarea ReadAjax_content">  第1章复仇者<br /><br />  夜晚时分,一座繁华中透露着浮躁的二线城市。<br /><br />  街道上车水马龙,夜生活的开始,让许多年轻人从闷热的房间中逃出,尽情挥霍着时光。<br /><br />  苏晓蹲坐在一栋二层别墅的房顶,夜风吹过,让他感觉到一阵凉爽。<br /> """ # 解析HTML element = etree.HTML(html_str) # 方法1:提取所有文本节点 text_nodes = element.xpath('//div[@id="chaptercontent"]//text()') # 此时text_nodes是一个列表,包含每个文本节点 # 合并文本并清理 text_content = ''.join(text_nodes).strip() # 或者可以进一步处理:将连续的空白字符(包括换行)替换为单个空格或保持原样 # 注意:这里原文中的空格和换行在提取后可能表现为空白字符,我们可以根据需求处理 # 方法2:使用string()函数,直接获取整个div的字符串 text_content2 = element.xpath('string(//div[@id="chaptercontent"])').strip() # 输出结果 print("方法1提取的文本内容:") print(text_content) print("\n方法2提取的文本内容:") print(text_content2) ``` ### 注意事项 - 在HTML中,`<br>`标签是换行,但在提取的文本中,我们可能希望保留段落分隔。在原始HTML中,文本之间用`<br />`分隔,因此提取的文本中,段落之间可能没有明显的换行符(因为XPath提取的文本节点不包含标签信息)。因此,我们可能需要将`<br>`标签转换为换行符,但XPath无法直接做到这一点。 - 如果希望保留段落结构,可以在提取后根据原始HTML中的`<br />`标签位置插入换行符。但使用XPath只能提取文本节点,无法提取标签。因此,方法1和方法2提取的文本都是连续的,没有换行符。 ### 改进方案 为了保留段落结构,我们可以先处理HTML字符串,将`<br />`标签替换为换行符,然后再提取文本。或者,我们可以使用XPath分别提取每个文本节点,并在遇到`<br />`标签时插入换行符,但这需要更复杂的处理。 另一种思路:使用XPath获取所有子节点,然后遍历,如果是文本节点则保留文本,如果是`<br />`则添加换行符。但这种方法需要遍历节点,代码稍复杂。 ### 简单处理(不保留换行) 如果不需要保留换行,那么上述两种方法都可以直接得到连续的文本,其中可能包含多个连续的空格或空白字符。我们可以用正则表达式将多个空白字符替换为一个空格,但这样会破坏原有的段落结构。 ### 结论 根据需求选择: - 如果只需要连续文本,忽略换行,则使用方法1或方法2。 - 如果需要保留换行,则需要在提取后根据原始HTML的`<br />`位置添加换行。但XPath本身不提供标签位置信息,因此可能需要结合其他方法。 ### 附加:保留换行的处理方法 我们可以使用XPath获取所有子节点(包括文本节点和元素节点),然后遍历每个节点,如果是文本节点则提取文本,如果是`<br>`元素则添加换行符。 示例代码: ```python # 获取div下的所有子节点(包括文本节点和元素节点) nodes = element.xpath('//div[@id="chaptercontent"]/node()') result_lines = [] for node in nodes: if isinstance(node, etree._ElementUnicodeResult): # 文本节点 result_lines.append(str(node).strip()) elif isinstance(node, etree._Element) and node.tag == 'br': # br标签 result_lines.append('\n') # 添加换行符 # 合并 text_with_newlines = ''.join(result_lines) # 清理多余的空白 text_with_newlines = text_with_newlines.strip() ``` 但是,注意:在原始HTML中,文本节点前面有空格(如:`  第1章复仇者`),这些空格在提取后仍然存在。我们可以根据需求决定是否去除每行前后的空格。 ### 最终建议 根据用户提供的HTML片段,文本之间由`<br /><br />`分隔,这表示两个段落之间有两个换行(即空行)。我们可以将两个连续的`<br />`替换为两个换行符,单个`<br />`替换为一个换行符。但上述遍历节点的方法可以处理。 ### 更简洁的方法 使用XPath提取整个div的HTML字符串,然后用字符串替换: ```python # 获取div的HTML内容(内部HTML) inner_html = element.xpath('//div[@id="chaptercontent"]')[0] inner_html_str = etree.tostring(inner_html, encoding='unicode', method='html') # 然后替换<br>标签 # 注意:这里可能有自闭合标签<br />,我们替换为换行符 import re # 将<br>或<br/>替换为换行 text_content = re.sub(r'<br\s*/?>', '\n', inner_html_str) # 去除HTML标签(只保留文本) text_content = re.sub(r'<[^>]+>', '', text_content) # 此时,text_content就是替换了br为换行符的纯文本 ``` 这种方法更简单直接,但效率较低。 ### 总结 根据需求选择合适的方法。如果只是要提取文字内容,不保留格式,则直接使用XPath提取文本节点并合并即可。如果需要保留换行,则可以采用替换的方法。 ### 参考文献 [^1]: XPath 是一种强大而灵活的查询语言,用于在 XML 和 HTML 文档中定位和提取元素。 [^2]: 使用XPath和lxml库在Python中提取HTML页面信息是一种高效的数据抓取方法。</think>### 使用XPath从HTML中提取文字内容的方法 根据您提供的HTML代码和引用[1][2],以下是使用XPath提取文字内容的完整解决方案: #### 核心步骤 1. **解析HTML结构** 使用lxml库将HTML字符串转换为XPath可操作的树结构: ```python from lxml import etree html = """<div id="chaptercontent" class="Readarea ReadAjax_content">...</div>""" tree = etree.HTML(html) # 转换为Element对象[^2] ``` 2. **编写XPath表达式** - 提取所有文本节点:`//div[@id="chaptercontent"]//text()` - 提取特定段落文本:`//div[@id="chaptercontent"]/text()[position()>1]` 3. **执行文本提取与处理** ```python # 方法1:提取所有文本节点 all_text = tree.xpath('//div[@id="chaptercontent"]//text()') clean_text = ''.join(all_text).strip() # 合并文本并去除空白 # 方法2:提取特定段落(排除第一个文本节点) paragraphs = tree.xpath('//div[@id="chaptercontent"]/text()[position()>1]') ``` #### 完整示例代码 ```python from lxml import etree html = """ <div id="chaptercontent" class="Readarea ReadAjax_content">  第1章复仇者<br /><br />  夜晚时分,一座繁华中透露着浮躁的二线城市。<br /><br />  街道上车水马龙,夜生活的开始,让许多年轻人从闷热的房间中逃出,尽情挥霍着时光。<br /><br />  苏晓蹲坐在一栋二层别墅的房顶,夜风吹过,让他感觉到一阵凉爽。<br /> """ # 解析HTML tree = etree.HTML(html) # 方法1:提取所有文本内容 text_nodes = tree.xpath('//div[@id="chaptercontent"]//text()') full_text = ''.join(text_nodes).replace('\u3000', ' ') # 替换全角空格 print("完整文本内容:") print(full_text.strip()) # 方法2:提取特定段落(排除章节标题) paragraphs = tree.xpath('//div[@id="chaptercontent"]/text()[position()>1]') print("\n主要段落:") for i, p in enumerate(paragraphs, 1): print(f"段落{i}: {p.strip()}") ``` #### 输出结果示例 ``` 完整文本内容: 第1章复仇者 夜晚时分,一座繁华中透露着浮躁的二线城市。 街道上车水马龙,夜生活的开始,让许多年轻人从闷热的房间中逃出,尽情挥霍着时光。 苏晓蹲坐在一栋二层别墅的房顶,夜风吹过,让他感觉到一阵凉爽。 主要段落: 段落1: 夜晚时分,一座繁华中透露着浮躁的二线城市。 段落2: 街道上车水马龙,夜生活的开始,让许多年轻人从闷热的房间中逃出,尽情挥霍着时光。 段落3: 苏晓蹲坐在一栋二层别墅的房顶,夜风吹过,让他感觉到一阵凉爽。 ``` ### 关键技术说明 1. **XPath表达式解析** - `//div[@id="chaptercontent"]`:定位特定ID的div元素 - `//text()`:获取所有后代文本节点[^1] - `text()[position()>1]`:通过位置筛选特定文本节点 2. **文本处理技巧** - `strip()`:去除首尾空白字符 - `replace('\u3000', ' ')`:替换中文全角空格 - 列表合并:`''.join()`连接文本碎片 3. **特殊字符处理** 对于包含换行符的文本(如引用[4]所述),可添加: ```python cleaned = re.sub(r'\s+', ' ', text) # 合并连续空白字符 ``` ### 注意事项 1. 使用`@id`定位比`@class`更精确,因ID通常唯一 2. 中文文档需注意全角空格`\u3000`的处理 3. 复杂结构可结合XPath轴操作如`following-sibling`[^3] XPath提供了强大的文档导航能力,结合Python的lxml库可高效提取结构化文本内容[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值