2

次のようなhtmlファイルがあります。

    <h2>section 1</h2>
    <p>para 1</p>
    <p>para 2</p>
    <p>para 3</p>
    <h2>section 2</h2>
    <p>para 1</p>
    <p>para 2</p>
    <p>para 3</p>
    <h2>section 3</h2>
    <p>para 1</p>
    <p>para 2</p>
    <p>para 3</p>

それらをPython辞書にスクレイピングしたいと思います:{'section1':'...', 'section2':'...', 'section3':'...'}もちろん、current_section変数を設定してwhileループを使用できますが、この目的のためのモジュールはありますか? BeautifulSoup をチェックアウトしましたが、そこにショートカットが見つかりませんでした。

ありがとう!

4

2 に答える 2

1

私の知る限り、 の行に沿って何もありませんsoup.group_by_header()が、あなたが説明した入力については、どのような場合でも達成するのはかなり簡単です:

>>> from bs4 import BeautifulSoup     
>>> html = """
...     <h2>section 1</h2>
...     <p>para 1</p>
...     <!-- etc. -->
... """
>>> soup = BeautifulSoup(html)
>>> sections = {}
>>> for header in soup("h2"):
...     paras = []
...     for sibling in header.find_next_siblings(text=False):
...         if sibling.name == "h2":
...             break
...         paras.append(sibling.string)
...     sections[header.string] = paras
... 
>>> sections
{u'section 1': [u'para 1', u'para 2', u'para 3'],
 u'section 2': [u'para 1', u'para 2', u'para 3'],
 u'section 3': [u'para 1', u'para 2', u'para 3']}
>>> 

そのアプローチは何らかの理由で問題がありますか、それとも、そのスーツを蹴る巧妙な BeautifulSoup メソッドがあるかどうか疑問に思っていましたか (公平を期すために、それらのいくつかはあります)。

于 2012-11-30T15:52:52.917 に答える
0

string組み込みのsplitメソッドが必要だと思います。あなたがそこに持っているテキストがあれば、あなたはするhtml_stringことができます

sections = html_string.split('<h2>')  #this deletes the opening h2 tag
for section in sections:
    section = '<h2>' + section   #replace the opening h2 tag
    #code to parse each section goes here

whileこれは、ループを使用するよりもはるかにクリーンなはずです。

于 2012-11-30T15:08:08.843 に答える