用于选择内部文本的正则表达式<td></td>

2024-09-28 16:49:11 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
RegEx match open tags except XHTML self-contained tags

从标记中只提取文本的最佳正则表达式是什么?如果我有这样的html标记

<tr class="classo">
<td>text1</td>
<td class="dot">text2 </td>
<td>text3</td>
<td class="dot"> text4</td>
<td class="dot">text4</td>
</tr>

td标记的数量不是固定的,其中一些标记将具有class属性,但我只对从td标记内部获取文本感兴趣


Tags: 标记文本matchtagsopendottrclass
3条回答

正则表达式不是用来解析HTML的。HTML不是正则语言,不能用正则表达式很容易地进行解析。在

很多人喜欢BeautifulSoup,但是它很漂亮slowanother source),不如{},后者甚至可以根据需要使用BeautifulSoup作为解析器。在

下面是一个使用lxml的解决方案。在

>>> import lxml.html
>>> html = lxml.html.fromstring("""
... <tr class="classo">
... <td>text1</td>
... <td class="dot">text2 </td>
... <td>text3</td>
... <td class="dot"> text4</td>
... <td class="dot">text4</td>
... </tr>""")
>>> print [e.text for e in html.xpath("td")]
['text1', 'text2 ', 'text3', ' text4', 'text4']

正则表达式<td.*?>(.*?)<\/td>就可以了。在

但是我可以推荐您使用HTMLParser Module或{a2}

我花了点时间给您写了另一个使用HTMLParser的示例:

from HTMLParser import HTMLParser

class TDExtractor(HTMLParser):

  def handle_starttag(self, tag, attrs):
      if tag == 'td':
          self.recording = True

  def handle_endtag(self, tag):
      if tag == 'td':
          self.recording = False

  def handle_data(self, data):
      if self.recording:
          self.data.append(data)

  def reset(self):
      HTMLParser.reset(self)
      self.data = []
      self.recording = False

在行动中:

^{pr2}$

与其花时间在正则表达式上,不如使用为任务设计的东西。我喜欢BeautifulSoup

>>> s = """
... <tr class="classo">
... <td>text1</td>
... <td class="dot">text2 </td>
... <td>text3</td>
... <td class="dot"> text4</td>
... <td class="dot">text4</td>
... </tr>
... """
>>> 
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> soup.find_all("td")
[<td>text1</td>, <td class="dot">text2 </td>, <td>text3</td>, <td class="dot"> text4</td>, <td class="dot">text4</td>]
>>> [tag.text for tag in soup.find_all("td")]
[u'text1', u'text2 ', u'text3', u' text4', u'text4']

相关问题 更多 >