makeHTMLTags
一部の HTML スクレイピングは、そのライブラリのメソッドを使用して pyparsing で簡単に実行できます (makeHTMLTags
開始タグと終了タグの式のペアを返しますが、この例では開始タグのみが必要です)。
from pyparsing import makeHTMLTags
fcTag = makeHTMLTags("fc")[0]
tagAttrs = 'dt s tx tn'.split()
for match in fcTag.searchString(htmltext):
print ' '.join("%s:%s" % (attr,match[attr]) for attr in tagAttrs)
版画:
dt:2013-03-07 s:d220 tx:16 tn:11
dt:2013-03-08 s:d220 tx:15 tn:10
dt:2013-03-09 s:d220 tx:15 tn:10
これにより、このフラグメント パーサーを pyparsing の他の機能 (実行時の解析アクション、セマンティック チェックなど) に簡単に組み込むことができます。
編集
すべての dt や s などをそれぞれのリスト (Python では「ベクトル」ではなく「リスト」と呼びます) に入れたい場合は、次のようにします。
dtArray = []
sArray = []
txArray = []
tnArray = []
for match in fcTag.searchString(htmltext):
dtArray.append(match.dt)
sArray.append(match.s)
txArray.append(match.tx)
tnArray.append(match.tn)
print ' '.join("%s:%s" % (attr,match[attr]) for attr in tagAttrs)
以前にこのようなコードを見たことがありますが、これはデータ構造パターンが貧弱です。、などを取得してdtArray[i]
、元のテーブルの i 番目のエントリの値にアクセスします。sArray[i]
代わりに、Python が提供するいくつかの構造化タイプの 1 つを検討してください。いくつかの選択肢があります:
A.辞書を使用します。
fcArray = []
for match in fcTag.searchString(htmltext):
fcArray.append(dict((attr,match[attr]) for attr in tagAttrs))
i 番目のエントリを取得するには、 を取得し、その dict から などの値にfc = fcArray[i]
アクセスします。fc['dt']
fc['s']
B. 名前付きタプルを使用する。
from collections import namedtuple
FCData = namedtuple("FCData", tagAttrs)
fcArray = []
for match in fcTag.searchString(htmltext):
fcArray.append(FCData(*(match[attr] for attr in tagAttrs)))
再びfc = fcArray[i]
i 番目のエントリを取得するために を使用しますが、今度は 、 などを使用して値にアクセスしますfc.dt
。fc.s
この形式は dict 形式よりも見栄えが良いと思いますが、いくつかの制限があります。すべてのタグ名は正当な Python 識別子でなければならないため、「rise/run」というタグがある場合、namedtuple は使用できません。また、namedtuple は不変です。既存の FCDatafc
を取得して、そのdt
フィールドに代入することはできませんfc.dt = "new datetime value"
。一方、辞書はこれを許可します。
C. オブジェクトを使用する。最も単純なのは、空のオブジェクト インスタンスを作成する「バッグ」タイプのオブジェクトで、単純な代入または setattr 呼び出しによって属性を追加します。
class FCData(object): pass
fcArray = []
for match in fcTag.searchString(htmltext):
fc = FCdata()
for attr in tagAttrs:
setattr(fc, attr, match[attr])
fcArray.append(fc)
で i 番目のエントリを取得しfc = fcArray[i]
、namedtuple と同様に、属性を取得しますfc.dt
。ただし、必要に応じて属性を変更することもでき、割り当てfc.dt = "new datetime value"
は機能します。
D. pyparsing の searchString メソッドによって作成されたオブジェクトを使用するだけです。
fcArray = fcTag.searchString(htmltext)
pyparsing は を返しParseResults
、辞書と名前付きタプルの両方の動作を組み合わせます。で i 番目のエントリにアクセスする前と同じですfc = fcArray[i]
。またはでdt
属性を読み取ることができます。名前付きタプルと同じように、を読み取ることはできますが、代入することはできません。dict と同じように、に割り当てることができます。fc.dt
fc['dt']
fc.dt
fc['dt']