我使用REGEX在Python中编译HTML文档中的字符串列表。字符串可以在td标记中找到,也可以在div标记中找到。我在正确使用REGEX OR以防止发生以下问题时遇到问题。如果我使用:
FindStrings= re.compile('<td>(.*?)</td>|padding:0;">(.*?)</div>')
MyStrings = re.findall(FindStrings, str(soup))
print MyStrings
我会得到这样的东西:
[('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]
我得到括号左侧的字符串是用<td>(.*?)</td>
找到的,右侧的字符串是用</td>|padding:0;">(.*?)</div>
找到的。我想知道应该在REGEX中添加什么才能得到下面这样的最终列表:
['apple', 'sky', 'red', 'summer', 'pizza']
不要使用正则表达式解析HTML。有一些专门的工具可以处理HTML格式。
使用BeautifulSoup
包的示例:
from bs4 import BeautifulSoup
data = """
<body>
<table>
<tr>
<td>apple</td>
<td>sky</td>
</tr>
<tr>
<td>red</td>
</tr>
</table>
<div>summer</div>
<div>pizza</div>
</body>
"""
soup = BeautifulSoup(data)
print [item.text for item in soup.find_all(['td', 'div'])]
打印:
[u'apple', u'sky', u'red', u'summer', u'pizza']
无论您如何解析/使用regex,您都可以在获得列表后使用Python的itertools
:
import itertools
item_list = [("apple", ""), ("sky", ""), ("red", ""), ("", "summer"), ("", "pizza")]
print(item_list)
flat_list = list(itertools.chain(*item_list))
result = filter(None, flat_list)
print(result)
输出:
[('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]
['apple', 'sky', 'red', 'summer', 'pizza']
您可以按照自己想要的方式处理正则表达式的结果
类似这样的东西-
#Result of regex in MyStrings
>>> MyStrings = [('apple', ''), ('sky', ''), ('red', ''), ('', 'summer'), ('', 'pizza')]
>>> [s[0] if s[1]=='' else s[1] for s in MyStrings]
['apple', 'sky', 'red', 'summer', 'pizza']