You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:21:59