-2

可能重复:
正则表达式匹配打开的标签,XHTML 自包含标签除外

从标签中仅提取文本的最佳正则表达式是什么?如果我有例如这种 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 标签的数量不固定,其中一些会有类属性,但我只对从 td 标签内部获取文本感兴趣

4

3 回答 3

2

与其花时间在正则表达式上,不如使用为任务设计的东西。我喜欢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']
于 2013-01-13T00:25:59.683 回答
1

正则表达式<td.*?>(.*?)<\/td>会正确执行。

但我可以推荐你使用HTMLParser 模块BeautifulSoup

花时间给你写了另一个使用 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

在行动中:

> tdextractor = TDExtractor()
> tdextractor.feed(some_htmldata)
> print(tdextractor.data) # will print a list with all the td data.
于 2013-01-13T00:28:56.533 回答
1

正则表达式不是为解析 HTML 而设计的。HTML 不是正则语言,不能用正则表达式轻松解析。

很多人喜欢BeautifulSoup,但它很另一个来源)并且不如lxml,它甚至可以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']
于 2013-01-13T00:33:03.373 回答