2

HTMLページからこのXMLコードを解析するPythonを配置しようとしています:

<weather>
    <loc mobiurl="http://foreca.mobi/?lon=-8.6110&lat=41.1496&source=navi/" url="http://foreca.com/?lon=-8.6110&lat=41.1496&source=navi/">
        <obs station="Porto / Pedras Rubras" dist="11 km NW" dt="2013-03-06 17:00:00" t="14" tf="14" s="d320" wn="S" ws="8" p="997" rh="94" v="5000"/>
        <fc dt="2013-03-07" tx="16" tn="11" s="d220"/>
        <fc dt="2013-03-08" tx="15" tn="10" s="d220"/>
        <fc dt="2013-03-09" tx="15" tn="10" s="d220"/>
    </loc>
</weather>

drstxおよびフィールドの情報を取得したいのですがtn、XML 関数を使用してそれを行う方法がわかりません。HTMLファイルを読み取ってから、作成して矢印を作成し、前に述べたパスの後にコンテンツを保存しようとしましたが、機能しません。

Pythonでデータを取得する簡単な方法はありますか?

4

2 に答える 2

0

天気タグだけを簡単に抽出できる場合は、Python に付属のxml.etree.ElementTreeAPIを使用できます。

import xml.etree.ElementTree as ET
tree = ET.fromstring(weatherdata)

for fcelem in tree.findall('.//fc'):
    print fcelem.attrib['tx'], fcelem.attrib['tn']

HTML ドキュメントから抽出する場合は、HTML の形式が適切かどうかによって異なります。XHTML ドキュメントの場合は、ElementTree API で問題なく処理できます。

それ以外の場合は、代わりに HTML パーサーに切り替える必要があります。lxmlライブラリをインストールできます。そのライブラリは同じ ElementTree API をサポートしていますが、専用の HTML パーサーが含まれています。

別の HTML API としてBeautifulSoupを使用することもできます。実際、lxmlBeautifulSoupは連携して動作し、タスクに合わせて API を選択できます。使いやすい方を使用してください。

lxmlとはどちら BeautifulSoupも外部ライブラリです。

于 2013-03-06T18:19:26.283 に答える
0

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.dtfc.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.dtfc['dt']fc.dtfc['dt']

于 2013-03-06T18:52:32.710 に答える