【问题标题】:how to prevent xpath adding commas on encountered tags如何防止xpath在遇到的标签上添加逗号
【发布时间】:2014-08-15 02:24:48
【问题描述】:

如何修改以下 xpath 命令不在任何子标签上添加逗号?

xpath('/a//text()').extract()

当前输出为

C,-(,K,1,, ,K,2,)-convexity

但我想要的是:

C-(K1, K2)-convexity

页面来源的相关部分:

<a href=".."><i>C</i>-(<i>K</i><sub>1</sub>, <i>K</i><sub>2</sub>)-convexity</a>

【问题讨论】:

    标签: python xpath web-scraping scrapy


    【解决方案1】:

    您提供的 xpath 没有任何问题,它只是返回多个结果,一个列表,您需要 join() 来制作单个字符串:

    >>> ''.join(response.xpath('/a//text()').extract())
    u'C-(K1, K2)-convexity'
    

    这是来自Scrapy shell


    如果这个值是scrapy.Field 值 - 最好使用Output Processors

    【讨论】:

    • 有什么方法可以编辑这个,以便找到的多个 a 用分号分隔?现在完全没有分隔符了。
    • @user1892697 是的,试试';'.join(response.xpath('/a//text()').extract())。它对你有用吗?
    • 不,这也会在 a 中添加分号,即C;-(;K;1;, ;K;2;)-convexity
    • @user1892697 尝试遍历 a 元素,例如:';'.join([e.xpath('string(.)')[0].extract() for e in response.xpath('/a')])
    • @elias 谢谢,这非常有效(输出与 todinov 的 ';'.join([re.sub('&lt;[^&lt;]+?&gt;', '', x) for x in response.xpath('/a').extract()]) 相同)。
    【解决方案2】:

    看起来你想要做的就是在捕获'a'标签之后剥离html标签,所以我会使用正则表达式:

    In [3]: import re
    In [4]: [re.sub('<[^<]+?>', '', x) for x in response.xpath('/a').extract()]
    Out[4]: [u'C-(K1, K2)-convexity']
    

    请注意,extract 返回一个列表,因此我们需要列表推导,这将返回一个列表。

    附:我并不是说这比 alecxe 的解决方案更好。我只是把它放在这里作为另一种选择。

    【讨论】:

    • 谢谢,我必须在';'.join() 中添加正则表达式,这样单个锚项内的逗号就不会与多个锚之间的逗号混合。
    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2019-10-22
    • 2022-01-27
    相关资源
    最近更新 更多