假设我有这样的事情:
var = '<li> <a href="/...html">Energy</a>
<ul>
<li> <a href="/...html">Coal</a> </li>
<li> <a href="/...html">Oil </a> </li>
<li> <a href="/...html">Carbon</a> </li>
<li> <a href="/...html">Oxygen</a> </li'
在标签之间提取文本的最佳(最有效)方法是什么?我应该使用正则表达式吗?我当前的技术依赖于在li
标记上拆分字符串并使用for
循环,只是想知道是否有更快的方法来执行此操作。
答案 0 :(得分:6)
从标记语言中提取信息的推荐方法是使用解析器,例如Beautiful Soup是一个不错的选择。 Avoid using regular expressions为此,它不适合这项工作!
答案 1 :(得分:2)
如果你想进入正则表达式路线(有些人认为这是解析HTML / XML的罪过),你可以尝试这样的事情:
re.findall('(?<=>)([^<]+)(?=</a>[^<]*</li)', var, re.S)
就个人而言,我认为正则表达式适用于一次性或简单的用例,但是你需要非常小心地编写你的正则表达式,以免创建出乎意料贪婪的模式。对于复杂的文档解析,最好使用BeautifulSoup等模块。
答案 2 :(得分:2)
如果您只是解析了标签内的内容,请尝试使用xpath例如
for text in var.xpath_all(".//ul/li"):
text = li.xpath('.//a/text()')
print text
您还可以使用urllib,BeautifulSoup等
答案 3 :(得分:2)
您可以使用非常适合此类任务的Beautiful Soup。它非常简单,易于安装并具有大量文档。
您的示例中有一些li标签未关闭。我已经做了更正,这是如何获得所有li标签
from bs4 import BeautifulSoup
var = '''<li> <a href="/...html">Energy</a></li>
<ul>
<li><a href="/...html">Coal</a></li>
<li><a href="/...html">Oil </a></li>
<li><a href="/...html">Carbon</a></li>
<li><a href="/...html">Oxygen</a></li>'''
soup = BeautifulSoup(var)
for a in soup.find_all('a'):
print a.string
它将打印:
能源
COA
石油
碳
氧
有关文档和更多示例,请参阅BeautifulSoup doc