xpath - 如何加入 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 表达式中有一个额外的内容。它应该是 :
//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-space
在div
元素上执行此操作的另一种方法:
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()
推荐阅读
- swift - 使用 didSelect 方法在 viewDidLoad 之后在单元格中显示图像
- python - 烧瓶python中的特殊字符问题
- powershell - 调用命令 InDisconnectedSession SessionOption 和 IdleTimeout 一班
- java - 哈希字符串可排序 - 大数据
- javascript - 将正则表达式应用于 redux-form 的 Field 组件中的 TextField 组件
- javascript - React:使用 createRef 从输入中获取数据
- r - `r_make()` 和 `make()` 在 r-drake 中不一致
- powershell - 防止 PowerShell ForEach-Object 展平列表?
- laravel - 如何通过标头传递参数?
- python - 微秒如何在 datetime.timedelta 中工作?