用 xpath 获取 p 标签所有文本内容, a 标签内容处理问题

2017-04-02 15:56:41 +08:00
 zyqf

完整链接: http://cn.nytimes.com/business/20170330/china-walt-disney-fake/

欲处理文本

<p class="paragraph">该公司表示,<a rel="nofollow" target="_blank" 

href="http://www.thepaper.cn/newsDetail_forward_1625731">今年 2 月</a>

,中国新闻网站澎湃报道称,孟德楷已与中国的几个城市签署项目协议,迪士尼因此展开调查。</p>

xpath 语法

//*[@id="content"]/p/text() | //*[@id="content"]/p/a/text()

得到的结果是 list :


['该公司表示,',
'今年 2 月',
',中国新闻网站澎湃报道称,孟德楷已与中国的几个城市签署项目协议,迪士尼因此展开调查。']

但我想要的结果是:

['该公司表示,今年 2 月,中国新闻网站澎湃报道称,孟德楷已与中国的几个城市签署项目协议,迪士尼因此展开调查。']

查来半天没找到解决的办法,无奈做回伸手党,各位有什么高见呢?

PS :要用 xpath 语法完成,不是获取结束后,再用代码处理成一个元素

12582 次点击
所在节点    问与答
7 条回复
starvedcat
2017-04-02 16:18:50 +08:00
//*[@id="content"]/p[a]/string-join(text())
starvedcat
2017-04-02 16:19:32 +08:00
我也是刚 google 的,这个网页好像有点用处: https://www.w3.org/TR/xpath-functions/
zyqf
2017-04-02 16:53:48 +08:00
@starvedcat 表达式无效唉

lxml.etree.XPathEvalError: Invalid expression
starvedcat
2017-04-02 16:58:41 +08:00
@zyqf 这我就不知道了。。。我是在 http://www.freeformatter.com/xpath-tester.html 这里测试通过的
zyqf
2017-04-02 18:16:44 +08:00
@starvedcat 不管怎么样,得到了一种新思路,谢谢你~
SoloCompany
2017-04-03 00:22:54 +08:00
可能你对 xpath 的行为理解有点错误吧
正确的表达式一个就足够了 //*[@id="content"]/p
如果你 select 的标的是 nodelist 那么得到的是所有 p 标签
如果你 select 的标的是 string (默认),就已经是所有文本 join 之后的结果
所以你应该修正你的 select 标的
zyqf
2017-04-08 14:17:38 +08:00
@SoloCompany 感谢您,现在才看到。上次已经解决了,直接用

//*[@id="content"]/p//text()
就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX