Python 在标记之间提取HTML

Python 在标记之间提取HTML,python,beautifulsoup,Python,Beautifulsoup,我想提取特定HTML标记之间的所有HTML <html> <div class="class1">Included Text</div> [...] <h1><b>text</b></h1><span>[..]</span><div>[...]</div> [...] <span class="class2"> [...]</span> 此

我想提取特定HTML标记之间的所有HTML

<html>
<div class="class1">Included Text</div>
[...]
<h1><b>text</b></h1><span>[..]</span><div>[...]</div>
[...]
<span class="class2">
[...]</span>
此外,HTML文件中有多个实例,因此我希望将它们全部匹配。我的意思是:

<html>
(first occurrence)
<div class="class1">Included Text</div>
[...]
<h1><b>text</b></h1><span>[..]</span><div>[...]</div>
[...]
<span class="class2">
[...]</span>

(2nd occurrence)
<div class="class1">Included Text</div>
[...]
<h1><b>text</b></h1><span>[..]</span><div>[...]</div>
[...]
<span class="class2">
[...]</span>  

(third occurrence)
<div class="class1">Included Text</div>
[...]
<h1><b>text</b></h1><span>[..]</span><div>[...]</div>
[...]
<span class="class2">
[...]</span>  
</html>

(首次出现)
包含的文本
[...]
案文[…][…]
[...]
[...]
(第二次出现)
包含的文本
[...]
案文[…][…]
[...]
[...]  
(第三次出现)
包含的文本
[...]
案文[…][…]
[...]
[...]  

我一直在用Beautifulsoup4寻找答案。但是,所有问题/答案都与提取文本之间的值有关,但这不是我想要的。我还想知道这在Beautifulsoup中是否可行,或者我是否必须改用正则表达式。

您可以使用bs4和itertools.takewhile扮演自己的函数

使用最新编辑:

In [15]: cond = lambda tag: tag.get("name") != "div" and tag.get("class") != ["class2"]

In [16]: for tag in soup.select("div.class1"):            
            for ele in get_html_between(tag, cond):
                print(ele)
            print("\n")
   ....:         
Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>


Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>


Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>
[15]中的
:cond=lambda标记:tag.get(“name”)!=“div”和tag.get(“class”)!=[“类别2”]
在[16]中:对于汤中的标签,选择(“div.class1”):
对于get_html_between(标记,条件)中的元素:
打印(ele)
打印(“\n”)
....:         
包含的文本
文本
文本
[..]
[...]
包含的文本
文本
文本
[..]
[...]
包含的文本
文本
文本
[..]
[...]

谢谢您的帮助。我变得越来越近了,但我不清楚我最终想要实现什么,我的错。现在我只想在第一个div标记中包含文本。此外,HTML文件中的两个标记之间也出现了多次HTML。我想对它们进行迭代并对它们进行grep。谢谢你,Padraic,我想我们就快到了。我已经编辑了我的问题,以澄清“匹配”多次出现的含义。@user3030473,最后一个代码块似乎正是你想要的,它怎么不适合你?非常感谢。输出由多个包含元素的列表组成。我希望输出是单个字符串。我通过使用UTF-8编码写入一个文件来解决这个问题,然后重新打开该文件,将其解码为值中的一个字符串。
h  = """<html>
 <div class="class1">Included Text</div>
[...]
<h1><b>text</b></h1><span>[..]</span><div>[...]</div>
[...]
<span class="class2">
[...]</span>"""

soup = BeautifulSoup(h)
def get_html_between(start_select, end_tag, cls):
    start = soup.select_one(start_select)
    all_next = start.find_all_next()
    yield "".join(start.contents)
    for t in takewhile(lambda tag: tag.get("name") != end_tag and tag.get("class") != [cls], all_next):
        yield t

for ele in get_html_between("div.class1","div","class2"):
    print(ele)
Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]
</span>
<div>[...]</div>
def get_html_between(start_tag, cond):
    yield "".join(start_tag.contents)
    all_next = start_tag.find_all_next()
    for ele in takewhile(cond, all_next):
        yield ele


cond = lambda tag: tag.get("name") != "div" and tag.get("class") != ["class2"]
soup = BeautifulSoup(h, "lxml")
for tag in soup.select("div.class1"):
    for ele in get_html_between(tag, cond):
        print(ele)
In [15]: cond = lambda tag: tag.get("name") != "div" and tag.get("class") != ["class2"]

In [16]: for tag in soup.select("div.class1"):            
            for ele in get_html_between(tag, cond):
                print(ele)
            print("\n")
   ....:         
Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>


Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>


Included Text
<h1><b>text</b></h1>
<b>text</b>
<span>[..]</span>
<div>[...]</div>