0

Python で正規表現を使用して、この行の HTML から次のデータを取得しています。

<td xyz="123"><a href="blah.html">This is a line</a></td>

問題は、上記の td 行でxyz="123"<a href>がオプションであるため、すべてのテーブル セルに表示されないことです。だから私はこのようなtdsを持つことができます:

<tr><td>New line</td></tr>
<tr><td xyz="123"><a href="blah.html">CaptureThis</a></td></tr>

私は次のように正規表現を書きました:

<tr><td x?y?z?=?"?(\d\d\d)?"?>?<?a?.*?>?(.*?)?<?/?a?>?</td></tr>

基本的に、各 tr のすべての tds から「123」データ (存在する場合) と「CaptureThis」データをキャプチャしたいと考えています。

この正規表現は機能せず、「xyz」データのない行をスキップしています。

ここで正規表現を使用することが適切な解決策ではないことは知っていますが、正規表現だけでできるかどうか疑問に思っていました。

4

3 に答える 3

2

正規表現を使用しており、XML とそのような表現とのマッチングは複雑すぎ、速すぎます。

代わりに HTML パーサーを使用してください。Python にはいくつかの選択肢があります。

  • ElementTreeは標準ライブラリの一部です
  • BeautifulSoupは人気のあるサードパーティ ライブラリです。
  • lxmlは、高速で機能豊富な C ベースのライブラリです。

ElementTree の例:

from xml.etree import ElementTree

tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
    print ElementTree.tostring(elem)
于 2012-09-10T07:59:42.623 に答える
0

xmlファイルを2回解析していただけませんか。正規表現を使用して解決する方がはるかに簡単ですが、これは正しい方法ではないため、予期しない問題が発生する可能性があります。

''tdセルのパラメータと一致する'>([\ w \ s] +)<'「CaptureThis」データと一致する

>>> line1
'<tr><td>New line</td></tr>'
>>> line2
'<tr><td xyz="123"><a href="blah.html">CaptureThis</a></td></tr>'  
>>> pattern2 = re.compile(r'>([\w\s]+)<')
>>> pattern2.search(line1).group(1)
'New line'
>>> pattern2.search(line2).group(1)
'CaptureThis'

>>> pattern = re.compile(r'<td\s+\w+="([^"]*)">')
>>> pattern.search(line2).group(1)
'123'

ただし、完全にはテストされていません。

于 2012-09-10T08:46:23.820 に答える