如何用requests-html 0.9.0区分HTML标签内文本与标签尾部文本?
如何用requests-html 0.9.0区分标签内部文本和标签尾部文本?
我尝试用requests-html 0.9.0解析这段HTML:
from requests_html import HTML html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>') data = html.find('.data', first=True) print(data.html) # <span class="data">important data</span> and some rubbish print(data.text) # important data and some rubbish现在需要区分
.data标签内部包裹的文本,以及这个标签之后的尾部文本(也就是标签闭合后跟着的内容)。
嘿,这个问题其实可以借助requests-html底层依赖的pyquery DOM操作能力轻松解决,我给你两种实用的方法:
方法1:通过父元素内容拆分文本
我们可以先拿到目标元素的父节点内容,再把目标元素和后面的文本节点分开处理:
from requests_html import HTML html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>') data_elem = html.find('.data', first=True) # 提取标签内部的文本,直接用text属性即可 inner_text = data_elem.text.strip() print(f"标签内部文本: {inner_text}") # 输出: important data # 获取父元素的所有子节点(包含元素节点和文本节点) parent_contents = data_elem.parent.contents() # 找到目标元素在父节点内容里的位置 elem_pos = parent_contents.index(data_elem) # 把元素后面的所有文本节点拼接起来,就是我们要的尾部文本 trailing_text = ''.join([node.strip() for node in parent_contents[elem_pos+1:] if isinstance(node, str)]).strip() print(f"标签尾部文本: {trailing_text}") # 输出: and some rubbish
方法2:直接获取后续兄弟文本节点
pyquery提供了next_siblings()方法,可以直接拿到当前元素之后的所有兄弟节点,我们只需要筛选出文本节点就行:
from requests_html import HTML html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>') data_elem = html.find('.data', first=True) inner_text = data_elem.text.strip() # 提取所有后续的兄弟文本节点并拼接 trailing_text = ''.join([sibling.strip() for sibling in data_elem.next_siblings if isinstance(sibling, str)]).strip() print(f"标签内部文本: {inner_text}") print(f"标签尾部文本: {trailing_text}")
这两种方法都能精准区分开标签内部的文本和标签之后的尾部内容,核心就是利用DOM节点的结构来拆分内容,而不是直接用text属性把所有文本混在一起~
内容的提问来源于stack exchange,提问作者Norrius
相关产品推荐
相关产品推荐

