从标签之间提取文本的有效方法

时间:2013-06-19 01:42:03

标签: python regex extract

假设我有这样的事情:

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循环,只是想知道是否有更快的方法来执行此操作。

4 个答案:

答案 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