首页 > 解决方案 > 如何加入 xpath 的结果?

问题描述

我有一个选择正确“部分”文本的 xpath,但它给了我一长串项目。

结构类似于(网站不同部分的变化)

路径: RID = P.xpath('//div[contains(@class, "phml msg-body")][contains(@id, "message1")])//text()').getall()

<div>
          formatting "stuff i do want" formatting
     <br>
          formatting "more stuff i want" formatting
<div>

从我的 xpath 我得到大约 10 个条目(再次取决于网站的格式),我只想要一个。

有没有办法获得像"stuff i do want more stuff i want"我附加到列表一样的输出,并且我的列表的长度应该为 1。

我目前的外籍人士给了我

'\r\n', '\r\n', '  ', ', ' stuff i do want', '  ', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', "more stuff i want", '  ', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n ```

标签: xpath

解决方案


我认为这是一个错字,但您)的 XPath 表达式中有一个额外的内容。它应该是 :

//div[contains(@class, "phml msg-body")][contains(@id, "message1")]//text()

假设您使用scrappy, 来获得预期的输出,您可以使用normalize-space忽略空白节点。然后使用.join, 和.strip()删除前导和尾随空格(formatting您正在谈论的)。所以下面的表达式应该起作用:

RID = " ".join([el.get().strip() for el in response.xpath("//div[contains(@class, "phml msg-body")][contains(@id, "message1")]//text()[normalize-space()]")])  

如果需要,您可以添加.replace("\r\n", "")之后.strip()进行最终清洁。

normalize-spacediv元素上执行此操作的另一种方法:

RID = normalize-space(//div[contains(@class, "phml msg-body")][contains(@id, "message1")]).get()

或者使用concat(假设您的示例数据的 div 对应于您的 XPath 表达式的 div):

RID = normalize-space(concat(//div[contains(@class, "phml msg-body")][contains(@id, "message1")]/text()[1],//div[contains(@class, "phml msg-body")][contains(@id, "message1")]/text()[2])).get()

推荐阅读