Python split() 不删除分隔符

129

这段代码几乎实现了我所需要的功能..

for line in all_lines:
    s = line.split('>')

除了它会删除所有“>”分隔符之外。

因此,

<html><head>

转换为

['<html','<head']

有没有一种方法可以使用split()方法,但是保留分隔符而不是删除它?

通过这些结果..

['<html>','<head>']

23
这并不是直接回答你的问题,但如果你想在Python中解析HTML,我强烈推荐使用Beautiful Soup - Michael Mior
10
应该重新开放这个问题。重复的那个问题只针对正则表达式。 - orestisf
2
@orestisf 另外,“重复”问题的答案与此不同。 ['<html','>','<head','>',''] 不同于 ['<html>','<head>']。我知道已经过了几个月,但我刚刚投票重新开放。如果你也这样做,其他人可能会接手完成它? - user1717828
1
使用re.split(r"(?<=>(?!$))", '<html><head>')可以直接得到答案。这样可以通过正则表达式的断言进行处理。 - dgor
这个问题包含一个明显的错误:"<html><head>".split(">")会产生三个字符串,分别是['<html','<head', ""],而不是列表['<html','<head'] - undefined
4个回答

77
d = ">"
for line in all_lines:
    s =  [e+d for e in line.split(d) if e]

12
可以正常工作…但我并不完全理解发生了什么。 - some1
7
它基本上遍历拆分结果并添加分隔符。 "s是一个列表,其中该列表中的每个元素都是e + d,其中e是line.split(d)的结果中的元素,但仅当e不为空时。" - JHixson
14
这将在结果列表的所有元素之间添加分隔符,即使是仅包含一个元素且没有分隔符的单元素列表也会如此。如果仅想要在拆分后的第一个元素末尾添加分隔符怎么办? - The Pied Pipes
20
这很粗糙。如果字符串是"a.b."或".a.b."并按"."分割会怎样? - thang
5
这将在字符串末尾添加一个分隔符,即使原始字符串末尾不存在分隔符。 - Vijayendra
显示剩余5条评论

38

如果您正在使用字符串分割解析HTML,则很可能做错了,除非您编写的是针对固定和安全内容文件的一次性脚本。如果它应该适用于任何HTML输入,那么您将如何处理类似于<a title='growth > 8%' href='#something'>这样的内容?

无论如何,以下方法适合我:

>>> import re
>>> re.split('(<[^>]*>)', '<body><table><tr><td>')[1::2]
['<body>', '<table>', '<tr>', '<td>']

如果您不确定所讨论的字符串是否以所需的分隔符结尾,似乎可以这样做:re.split("(.*\n?)", "my\nstr\ning")[1::2] - Seth Robertson
如果你想解析HTML,应该去https://automatetheboringstuff.com/2e/chapter12/阅读这一章节。它包含了关于解析HTML和网页抓取的所有必要知识。如果这个链接失效了,可以考虑使用requests、beautifulsoup和selenium库。 - zicameau

22
这样怎么样?
import re
s = '<html><head>'
re.findall('[^>]+>', s)

1

只需将其拆分,然后对于数组/列表中的每个元素(除了最后一个),在其后添加一个尾随的">"。


3
那么对于 ">>" 的情况,它只会变成 ">"。 - paulm
@paulm 不行,因为像"<html>>body".split('>')这样分割两个>会在中间创建一个空元素["<html", "", "body"]。除非你想要多个>在处理后仅生成单个>,那么您可以先删除这些空字符串。 - yyny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接