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

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循环,只是想知道是否有更快的方法来完成这个任务。

这是故意不正确的HTML吗?最后一个li标签没有关闭,第一个标签中忘记了闭合标签,同样地,也没有闭合的ul标签...这是有意为之吗? - Ryan Saxe
2
“最好的”和“最有效率的”这两个词都非常模糊不清... - Sinkingpoint
4个回答

7

1
那么可能是这样的,var.findall(text = True) - Max Kim

6
你可以使用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

它将打印:

能源




有关文档和更多示例,请参见BeautifulSoup doc


3
如果你只是想解析标签内的内容,可以尝试使用xpath。例如:
for text in var.xpath_all(".//ul/li"):
     text = li.xpath('.//a/text()')
     print text

您也可以使用urllib,BeautifulSoup等工具。

2

如果您想使用正则表达式来解析HTML/XML(有些人认为这是一种罪过),您可以尝试以下方法:

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

个人认为,正则表达式适用于一次性或简单应用情况,但在编写正则表达式时需要非常小心,以免创建出意外贪婪的模式。对于复杂的文档解析,最好使用像 BeautifulSoup 这样的模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接