-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 タグの数は固定されておらず、一部には class 属性がありますが、td タグ内からテキストを取得することにのみ興味があります

4

3 に答える 3

2

正規表現に時間を費やす代わりに、タスク用に設計されたものを使用してください。私は美しいスープが好きです:

>>> 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 に答える