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

この種のタスクに非常に適したビューティフル スープを使用できます。非常に簡単で、インストールが簡単で、大量のドキュメントがあります。

あなたの例には、いくつかの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 のドキュメントを参照してください。

于 2013-06-19T06:16:01.343 に答える
3

タグの内容を解析した後である場合は、xpath などを使用してみてください。

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

urllib、BeautifulSoup なども使用できます。

于 2013-06-19T01:51:18.617 に答える
2

正規表現ルート (HTML/XML を解析するのは罪だと考える人もいます) に行きたい場合は、次のようなことを試すことができます。

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

個人的には、正規表現は1回限りまたは単純なユースケースには問題ないと思いますが、予期せず貪欲になる可能性のあるパターンを作成しないように、正規表現を書く際には非常に注意する必要があります. 複雑なドキュメントの解析には、 BeautifulSoupのようなモジュールを使用するのが常に最善です。

于 2013-06-19T01:49:20.093 に答える