1

これは合法的なlxml教祖のためのものです。div.contentWebサイト上の多数の(コンテンツはクラスです)タグを反復処理するWebスクレイピングアプリケーションがあります。div.contentタグに入ったら、要素<a>の子であるタグがあるかどうかを確認したいと思い<h3>ます。XPathこれは、div.contタグを使用してリストを作成しようとするだけで、比較的簡単に思えます。

linkList = tree.xpath('div[contains(@class,"cont")]//h3//a')

tuple問題は、 div.contentボックスからのリンクと、同じdiv.contentボックスの段落要素からのテキストを含むを作成したいということです。<a>明らかに、ドキュメント全体を反復処理して、すべての段落テキストとすべてのリンクを保存することはできますが、適切な段落をタグに一致させる実際の方法はありません。

lxmlのElement.iter()関数は、すべてのdiv.cont要素を反復処理し、タグのない要素を無視<a>し、コンボをペアリングすることでこれを実現できますparagraph/aが、残念ながら、そのメソッドでクラス名を反復処理するオプションはなく、タグ名のみを反復処理するオプションはないようです。

編集:これが私が解析したいHTMLの非常に簡略化されたバージョンです:

<body>
<div class="cont">
    <h1>Random Text</h1>
    <p>The text I want to obtain</p>
    <h3><a href="somelink">The link I want to obtain</a></h3>
</div>
</body>

私が扱いたいこのようなdiv.contsはたくさんあります-それらのほとんどはこれよりはるかに多くの要素を持っていますが、これは私が何を扱っているかをあなたに理解させるための単なるスケッチです。

4

1 に答える 1

2

あまり具体的でないXPath式を使用することもできます。

for matchingdiv in tree.xpath('div[contains(@class,"cont")]'):
    # skip those without a h3 > a setup.
    link = matchingdiv.xpath('.//h3//a')
    if not link:
        continue

    # grab the `p` text and of course the link.

これを拡張して(野心的に)、h3>aタグを選択してから、div.cont祖先に移動できます(子孫および子孫のtext()述語を使用したXPathクエリに基づく):

for matchingdiv in tree.xpath('.//h3//a/ancestor::*[self::div[contains(@class,"cont")]]'):
    # no need to skip anymore, this is a div.cont with h3 and a contained
    link = matchingdiv.xpath('.//h3//a')

    # grab the `p` text and of course the link

しかし、とにかく実際には何も買わないリンクをスキャンする必要があるので。

于 2013-01-28T22:26:49.660 に答える