【问题标题】:How to get this value with only one xpath?如何只用一个 xpath 获得这个值?
【发布时间】:2020-06-21 10:21:10
【问题描述】:

我想要一个 XPATH,它能够在所有情况下选择日期和时间(例如 2020 年 6 月 19 日晚上 08:59):

<span class="post_date"><span title="June 21, 2020 at 08:18 AM" currentmouseover="12">1 hour ago</span> <span class="post_edit" id="edited_by_2462600"> </span></span>

<span class="post_date" currentmouseover="62">June 19, 2020 at 08:56 PM <span class="post_edit" id="edited_by_2454907"> </span></span>

<span class="post_date" currentmouseover="157"><span title="June 20, 2020" currentmouseover="168">Yesterday</span> at 10:41 AM <span class="post_edit" id="edited_by_2457722"> </span></span>

我可以使用//*[@class="post_date"]/text() 轻松获得第二个,但是有没有办法获得另外两个并在所有情况下都有 1 个 xpath?还是我最好为此编写一个函数?

谢谢

【问题讨论】:

    标签: xpath scrapy web-crawler


    【解决方案1】:

    使用 XPath 表达式用一个表达式选择所有日期:

    (//@title|//text())[contains(.,", ") or contains(.," at ")]
    

    输出:4 个节点

    编辑:如果您需要更强大的东西(假设所有消息都是在 2000 年之后发布的)。

    //span[@class='post_date']/span[contains(@title,', 20')]/@title|//span/text()[contains(.,' at ') and contains (.,':')][ancestor::*[1][self::span][@class='post_date']]
    

    或者:

    (//span[@class='post_date']/span[@title]/@title|//span/text()[ancestor::*[1][self::span][@class='post_date']])[contains(.,', 20') or contains(.,' at ')]
    

    输出:4 个节点

    【讨论】:

    • 谢谢,有效的 xpath,但不幸的是,它会抓取很多不需要的东西,其他短语包含“,”或“post_date=r.xpath('(.//@title|.//text())[contains(.,", 2") or contains(.," at ")]').get()”这样就很接近了,除了它错过了第三种情况的时间是只有当文本包含“ at”时,才有办法删除标题和文本?
    • 好的。使用 2 个更强大的 XPath 表达式编辑帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多