【问题标题】:Extract all text in between two nodes using xpath for websrcaping?使用 xpath 提取两个节点之间的所有文本以进行 websrcaping?
【发布时间】:2017-01-23 18:55:18
【问题描述】:
       <div class="jokeContent">
            <h2 style="color:#369;">Can I be Frank</h2>
            What did Ellen Degeneres say to Kathy Lee? 
           <p></p> <p>Can I be Frank with you? </p> 
           <p>Submitted by Calamjo</p> 
           <p>Edited by Curtis</p>      
       <div align="right" style="margin-top:10px;margin-bottom:10px;">#joke <a href="http://www.jokesoftheday.net/tag/short-jokes/">#short</a> </div>
       <div style="clear:both;"></div>
    </div>

所以我试图提取 之后和 [div aign = "right" style=...] 节点之前的所有文本。 到目前为止我所尝试的:

    jokes = response.xpath('//div[@class="jokeContent"]')
    for joke in jokes:
        text = joke.xpath('text()[normalize-space()]').extract()]
        if len(text) > 0:
            yield text

这在某种程度上有效,但网站在 html 中不一致,有时文本嵌入在 <.p> TEXT 中,有时嵌入在 <.br> TEXT 中或只是 TEXT。 所以我认为只提取标题之后和样式节点之前的所有内容可能是有意义的,然后可以在后面进行过滤。

【问题讨论】:

    标签: xpath web-scraping scrapy


    【解决方案1】:

    如果您正在寻找您所描述内容的文字 xpath,它可能类似于:

    In [1]: sel.xpath("//h2/following-sibling::*[not(self::div) and not(preceding-sibling::div)]//text()").extract()
    Out[1]: [u'Can I be Frank with you? ', u'Submitted by Calamjo', u'Edited by Curtis']
    

    但可能有一个更合乎逻辑、更清晰的结论:

    In [2]: sel.xpath("//h2/following-sibling::p//text()").extract()
    Out[2]: [u'Can I be Frank with you? ', u'Submitted by Calamjo', u'Edited by Curtis']
    

    这只是选择段落标签。你说段落标签可能是别的东西,你可以用self::tag规范匹配几个不同的标签:

    In [3]: sel.xpath("//h2/following-sibling::*[self::p or self::br]//text()").extract()
    Out[3]: [u'Can I be Frank with you? ', u'Submitted by Calamjo', u'Edited by Curtis']
    

    编辑:显然我错过了 div 本身下的文本。这可以用| 或选择器修改:

    In [3]: sel.xpath("//h2/../text()[normalize-space(.)] | //h2/../p//text()").extract()
    Out[3]: 
    [u'\n            What did Ellen Degeneres say to Kathy Lee? \n           ',
     u'Can I be Frank with you? ',
     u'Submitted by Calamjo',
     u'Edited by Curtis']
    

    normalize-space(.) 仅用于删除不包含文本的文本值(例如'\n')。
    您可以将此 xpath 的第一部分附加到上述任何内容中,您会得到类似的结果。

    【讨论】:

    • 好的,我看到这适用于每个定义的标签,但在上面的示例中,句子(Ellen Degeneres 对 Kathy Lee 说了什么?)缺少标签。有什么聪明的方法可以得到这个呢? (这就是为什么我认为将所有内容放在 div 类之间可能会有用。
    • @OliverEbrle 哦,对不起,我完全错过了。请参阅我的编辑以了解如何获得该位。
    • 好的,很好,这解决了我的一些问题,但当然会出现新的问题:例如在此页面上 (jokesoftheday.net/tag/short-jokes/6) 我想使用 joke.xpath(".//h2/../text()[normalize-space(.)] | .//h2/../p/ 删除所有笑话/text()").extract() 但由于网站格式不一致,一些 h2 标题也会被提取。例如。

      “我告诉骑士 th

      在这里使用 xpath '告诉骑士 th' 是除了完整的(期望) 文本。
    • 我猜是因为标题中的?但我不完全理解为什么它会被提取,因为 xpath 正在提取 h2 标记之后的所有内容,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多