首页 > 解决方案 > 如何使用xpath和python提取包含不需要的BR标签的标签之间的文本?

问题描述

在 div 标签中有我想提取的文本,但在一个主要的介绍和一个不幸的是在 div 内的页脚中。

文本开头总是有 3 个 BR 标签,末尾有 2 个 BR 标签,中间的文本也可能与 BR 标签本身分开。

简单示例如下所示:

   <div class="text" itemprop="description">
            bla
        <br>
            bla
        <br>
        <br>
            text
        <br>
            text
        <br>
            text
        <br>
        <br>
            bla
    </div>

完整的例子:

response.xpath('//div[@itemprop="description"]').extract_first()

'<div class="text" itemprop="description">jung<br><br>Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.<br><br>Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.</div>'

尝试通过执行字符串方法删除标签并不能解决问题,因为我还将删除中间的 BR,并且我还想删除不需要的页眉/页脚。

response.xpath('string(//div[@itemprop="description"])').extract_first()

预期输出:

Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben。Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt。Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch zB Ziegen。Es kristallisierte sich auch schnell heraus, dass er der intelligenceeste unserer 11 韦尔彭战争。Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist。Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie,wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben。Es war aber nicht seine Schuld,dass es nicht funktioniert hat,er hat sich nicht falsch verhalten。Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß。Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben。Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt。Rudi ist selbstverständlich gechippt, geimpft und entwurmt。

预期删除:

荣格



Weitere Angaben:Rüde、EU-Heimtierausweis、entwurmt、gechipt、geimpft、nur für Hundeerfahrene、verträglich mit Katzen、Familienhund、kinderfreundlich。

如何删除前导文本和页脚文本并提取其余文本?

标签: pythonxpath

解决方案


您可以使用以下 XPath :

//div[@itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]

代码 :

data = """HTML
<div class="text" itemprop="description">jung<br><br>Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.<br><br>Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.</div>
HTML"""

import lxml.html
tree = lxml.html.fromstring(data)
print (tree.xpath('//div[@itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]'))

输出 :

['Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.']

测试OK:

编辑:XPath 解释:

我们寻找特定 div 的文本节点子节点。文本节点必须满足以下条件:

  • 不是最后一个文本节点(排除“Weitere Angaben...”)
  • 文本节点的第二个前面的兄弟元素必须是 br 元素(排除第一个文本元素,如狗品种和 statut)

这样,XPath 表达式选择前两个连续 br ( <br/><br/>) 之后的文本节点,并在最后一个文本节点之前停止。


推荐阅读