XPath提取多<p>标签描述内容时,normalize-space仅返回首个标签问题
搞定XPath提取多
标签描述的问题
嘿,我来帮你解决这个提取描述文本的麻烦事儿!你遇到的问题其实挺常见的,咱一步步来捋清楚:
把所有
内容整合成干净文本
你之前用normalize-space只拿到第一个,是因为直接对节点列表用这个函数时,XPath默认只会处理列表里的第一个节点。要覆盖所有
,得先给每个节点单独做空格清理,再拼接起来。用XPath 2.0+支持的
string-join函数就能实现:string-join(//*[@id='description']/p/normalize-space(.), ' ')这个表达式的逻辑是:先选中所有目标
节点,对每个节点执行
normalize-space()去掉前后空格、合并中间多空格,最后用空格把所有处理后的文本拼成一段。对付更乱的格式(换行、制表符啥的)
如果内容里有一堆换行、制表符这类糟心的格式,光靠normalize-space不够,咱可以搭配translate函数先把这些乱码替换成空格,再处理:string-join(//*[@id='description']/p/normalize-space(translate(., '\n\t', ' ')), ' ')先把换行(
\n)和制表符(\t)换成空格,再清理每个的空格,最后拼接,这样文本会清爽很多。
如果你的工具不支持XPath 2.0?用代码补位!
要是你用的爬虫工具或库只支持XPath 1.0(比如有些旧版的解析工具),那就在代码层面处理更灵活:先把所有的文本捞出来,逐个清理空格,再拼接。比如用Python的lxml库:
from lxml import etree import re # 先解析HTML tree = etree.HTML(你的HTML内容) # 拿到所有<p>的文本(包括嵌套标签里的内容) p_texts = tree.xpath("//*[@id='description']/p//text()") # 逐个清理空文本,合并成一段 cleaned_text = ' '.join([text.strip() for text in p_texts if text.strip()]) # 最后用正则干掉多余的空格 cleaned_text = re.sub(r'\s+', ' ', cleaned_text).strip()这种方式还能处理更复杂的格式问题,比如多余的换行、特殊符号啥的,调整正则就行。
内容的提问来源于stack exchange,提问作者Melinsuna
相关产品推荐
相关产品推荐

