基于节点实例提取

时间:2016-05-23 18:31:58

标签: python beautifulsoup

我正在尝试使用Beautiful Soup提取一些文本。相关部分看起来像这样。

...
<p class="consistent"><strong>RecurringText</strong></p>
<p class="consistent">Text1</p>
<p class="consistent">Text2</p>
<p class="consistent">Text3</p>
<p class="consistent"><strong>VariableText</strong></p>
...

RecurringText,顾名思义,在所有文件中都是一致的。但是,VariableText会发生变化。它唯一的共同点是它是下一个编码部分。我想得到Text1,Text2和Text3提取。之前(包括RecurringText)以及之后(包括和包含VariableText之后)的内容可以留下。我在其他地方发现了RecurringText的提取部分,但如果有意义,我不确定如何删除下一个项目。

总而言之,我如何根据VariableText的特性(字符串在整个网址中是可变的)提取,一直在Text1,Text2,...,Textn的最后一项之后(其中n在文件之间是不同的)

1 个答案:

答案 0 :(得分:1)

您基本上可以从包含p元素的strong元素到包含p元素的另一个strong元素获取项目:

from bs4 import BeautifulSoup

data = """
<div>
    <p class="consistent"><strong>RecurringText</strong></p>
    <p class="consistent">Text1</p>
    <p class="consistent">Text2</p>
    <p class="consistent">Text3</p>
    <p class="consistent"><strong>VariableText</strong></p>
</div>
"""

soup = BeautifulSoup(data, "html.parser")
for p in soup.find_all(lambda elm: elm and elm.name == "p" and elm.text == "RecurringText" and \
                       "consistent" in elm.get("class") and elm.strong):
    for item in p.find_next_siblings("p"):
        if item.strong:
            break
        print(item.text)

打印:

Text1
Text2
Text3