4

BeautifulSoupで解析しているhtmlコードがいくつかあります。要件の1つは、タグが段落やその他のテキストタグにネストされていないことです。

たとえば、次のようなコードがある場合:

<p>
    first text
    <a href="...">
        <img .../>
    </a>
    second text
</p>

私はそれを次のようなものに変換する必要があります:

<p>first text</p>
<img .../>
<p>second text</p>

次のように、画像を抽出して段落の後に追加するために何かをしました。

for match in soup.body.find_all(True, recursive=False):                
    try:            
        for desc in match.descendants:
            try:
                if desc.name in ['img']:      

                    if (hasattr(desc, 'src')):                            
                        # add image as an independent tag
                        tag = soup.new_tag("img")
                        tag['src'] = desc['src']

                        if (hasattr(desc, 'alt')):
                            tag['alt'] = desc['alt']
                        else
                            tag['alt'] = ''

                        match.insert_after(tag)

                    # remove image from its container                            
                    desc.extract()

            except AttributeError:
                temp = 1

    except AttributeError:
        temp = 1

空の要素(画像が削除された後に空のままになるタグなど)を削除する別のコードを作成しましたが、要素を2つの異なる要素に分割する方法がわかりません。

4

2 に答える 2

1
import string
the_string.split(the_separator[,the_limit])

これにより配列が生成されるため、 for ループを使用するか、要素を手動で取得できます。

  • the_limit は不要です

あなたの場合、the_separator は "\n" である必要があると思いますが、それはケースバイケースです。構文解析は非常に興味深いものですが、時には難しいこともあります。

于 2012-09-27T08:23:20.823 に答える
-1
from bs4 import BeautifulSoup as bs
from bs4 import NavigableString
import re

html = """
<div>
<p> <i>begin </i><b>foo1</b><i>bar1</i>SEPATATOR<b>foo2</b>some text<i>bar2 </i><b>end </b> </p>
</div>
"""
def insert_tags(parent,tag_list):
    for tag in tag_list:
        if isinstance(tag, NavigableString):
            insert_tag = s.new_string(tag.string)
            parent.append(insert_tag)
        else:
            insert_tag = s.new_tag(tag.name)
            insert_tag.string = tag.string
            parent.append(insert_tag)

s = bs(html)
p = s.find('p')
print s.div
m = re.match(r"^<p>(.*?)(SEPATATOR.*)</p>$", str(p))
part1 = m.group(1).strip()
part2 = m.group(2).strip()

part1_p = s.new_tag("p")
insert_tags(part1_p,bs(part1).contents)

part2_p = s.new_tag("p")
insert_tags(part2_p,bs(part2).contents)

s.div.p.replace_with(part2_p)
s.div.p.insert_before(part1_p)
print s.div

その目的でネストされた HTML を使用しないので、問題なく動作します。確かに、それはまだ厄介に見えます。私の例で生成します

<div>
<p><i>begin </i><b>foo1</b><i>bar1</i></p>
<p>SEPATATOR<b>foo2</b>some text<i>bar2 </i><b>end </b></p>
</div>
于 2013-02-01T17:48:21.243 に答える