0

H1タグを渡された画像を見つけようとしています。マークアップは、オンライン マガジンの任意の記事にすることができます ()。つまり、特定のコンテナーなどに依存することはできません。

私の最初のアイデアは、H1 タグの文字位置と見つかった画像を見つけることでした。これにより、H1 タグに対する位置を特定できます。何かが欠けていない限り、美しいスープで見つかった要素の文字位置を取得する方法が見つかりません。

html を解析するためにどのようなアプローチを使用する必要があるとしても、形式が正しくない構文で動作する必要があります。

例:

<html>
    <p>some text</p>
    <img src="#" alt="I don't care about this image"/>
    <h1>This is the title</h1>
    <img src="#" alt="This is the first image I want to get"/>
    <p>some more content</p>
    <img src="#" alt="This is the secod image I want to get"/>
</html>

上記の HTML を解析すると、H1 タグの下にある 2 つの画像のリストが返されます。

更新:問題をよりよく説明するために、質問を完全に書き直しました。

4

2 に答える 2

0

lxmlはこれに簡単に適合する可能性があります。これにより、すべての img タグが取得されますが、h1 タグが前にあるもののみが出力されます。DOM にも表示される順に実行されます。

from lxml import etree
from StringIO import StringIO

html = """
<body>
<h1>a</h1>
<img src="afterh1-1"/>
<h2>b</h2>
<img src="afterh2"/>
<h1>a</h1>
<img src="afterh1-2"/>
</body>
"""

f = StringIO(html)
tree = etree.parse(f)

for i in tree.xpath('//img'):
    if i.getprevious().tag.lower() == "h1":
        print "Match: %s - %s" % (i.get('src'), i.getprevious().tag)

出力:

Match: afterh1-1 - h1
Match: afterh1-2 - h1

同じ出力が得られる美しいスープバージョンは次のとおりです

from bs4 import BeautifulSoup

html = """
<body>
<h1>a</h1>
<img src="afterh1-1"/>
<h2>b</h2>
<img src="afterh2"/>
<h1>a</h1>
<img src="afterh1-2"/>
</body>
"""

soup = BeautifulSoup(html)

for i in soup.find_all('img'):
    if i.previous_sibling.previous_sibling.name == "h1":
        print "Match: %s - %s" % (i.get('src'), i.previous_sibling.previous_sibling.name)
于 2013-06-11T01:53:12.590 に答える