我使用REGEX从Python中的HTML文档编译字符串列表。字符串可以在td标记内找到,也可以在div标记内找到。我在使用REGEX时遇到问题或者是为了防止出现以下问题。如果我使用:
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']
答案 0 :(得分:4)
Do not use regex for parsing 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']
答案 1 :(得分:2)
无论您如何解析/使用正则表达式,您都可以在获得列表后使用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']
答案 2 :(得分:0)
您可以按照您想要的方式处理正则表达式的结果 像这样的东西 -
#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']