8

假设我有这样的事情:

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

4 回答 4

6

从标记语言中提取信息的推荐方法是使用解析器,例如Beautiful Soup是一个不错的选择。避免为此使用正则表达式,这不是工作的正确工具!

于 2013-06-19T01:46:43.090 回答
4

您可以使用非常适合此类任务的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文档

于 2013-06-19T06:16:01.343 回答
3

If you're only after parsing what's inside the tags, try using xpath e.g.

for text in var.xpath_all(".//ul/li"):
     text = li.xpath('.//a/text()')
     print text

You can also use urllib, BeautifulSoup, etc.

于 2013-06-19T01:51:18.617 回答
2

if you want to go the regex route (which some people believe is a sin for parsing HTML/XML), you could try something like this:

re.findall('(?<=>)([^<]+)(?=</a>[^<]*</li)', var, re.S)

Personally, I think regex is fine for one-offs or simple use-cases, but you need to be very careful in writing your regex, so as not to create patterns that can be unexpectedly greedy. For complex document parsing, it is always best to go with a module like BeautifulSoup.

于 2013-06-19T01:49:20.093 回答