如何分割标签周围的 HTML 字符串?

问题描述 投票:0回答:3

如何使用Python通过指定的不配对标签分割html字符串?例如

split('hello<br    >there', 'br')

应该返回

['hello', 'there']

split('<div id="d71">text1<br data-i="1">text2<br>text3</div>', 'br')

应该返回

['<div id="d71">text1', 'text2', 'text3</div>']

我看过了

def get_start_stop(source, tag_name):
    soup = BeautifulSoup(source, 'html.parser')
    return dir(soup.find(tag_name))

但是我所希望的事情,

sourcepos
string
strings
self_and_descendants
.nextSibling.sourcepos
没有获得开始和结束索引所需的信息(据我所知)源字符串中的标签。

我也尝试过类似的事情

from lxml import html

def split(input_str, tag_name):
    tree = html.fromstring(input_str)
    output_list = []
    for element in tree.iter():
        if element.tag == tag_name:
            output_list.append(element.tail)
        else:
            output_list.append(html.tostring(element, encoding='unicode', with_tail=False))
    return output_list

但是

with_tail=False
没有达到我的预期

python beautifulsoup lxml
3个回答
0
投票

使用

lxml
作为 HTML 解析器

假设文档片段是

<div id="d71">text1<br/>text2<br/>text3</div>

查找 div 元素内的所有文本节点

from lxml import html
doc = html.parse('temp.html')
# returns a node set of text nodes
d71txt = doc.xpath('//div[@id="d71"]/text()'

结果

['text1', 'text2', 'text3']

子元素的

tail
属性也包含其中一些文本节点。使用
descendant-or-self
xpath 轴

>>> d71nodes = doc.xpath('//div[@id="d71"]/descendant-or-self::*')
>>> d71nodes[0].text
'text1'
>>> d71nodes[1].tail
'text2'
>>> d71nodes[2].tail
'text3'

0
投票

这是一个例子:

from bs4 import BeautifulSoup

text = """
<p>one<br>two</p>
<p>two<br>three</p>
"""

page = BeautifulSoup(text, "html.parser")

for t in page.find_all('p'):
    print("Got this:", t)
    for u in t:
        print(u)

输出:

Got this: <p>one<br/>two</p>
one
<br/>
two
Got this: <p>two<br/>three</p>
two
<br/>
three

我认为如何从中获取之前和之后应该非常清楚。


-2
投票

我认为BeautifulSoup并没有直接提供HTML标签的开始和结束索引,但是你可以通过在原始字符串中定位标签来找到它们

def get_start_stop(source, tag_name):
    soup = BeautifulSoup(source, 'html.parser')
    tag = soup.find(tag_name)
    if tag:
        start = source.find(f"<{tag_name}")
        end = source.find(">", start) + 1
        return start, end
    return None
© www.soinside.com 2019 - 2024. All rights reserved.