如何使用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
没有达到我的预期
使用
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'
这是一个例子:
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
我认为如何从中获取之前和之后应该非常清楚。
我认为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