0

私はhtmlを解析するためにpython + beautifulsoupを使用しています。私の問題は、さまざまな量のテキスト項目があることです。この場合、たとえば、「テキスト 1」、「テキスト 2」、...「テキスト 4」を抽出したいとします。他の Web ページでは、「テキスト 1」または場合によっては 2 つしかない場合があります。したがって、変化します。「テキスト x」がタグに含まれていれば、私の生活は楽になります。しかし、そうではありません。next と previous (またはおそらく nextSibling と previousSibling) を使用してそれらにアクセスできますが、頭のてっぺんからそれらすべてを取得する方法がわかりません。アイデアは、(私が遭遇する最大数が4であると仮定して)「テキスト1」をファイルに書き込み、「テキスト4」までずっと進むことです。それがこの場合です。「テキスト 1」しかない場合は、「テキスト 1」をファイルに書き込み、そして、2-4の空白があります。私が何をすべきかについての提案はありますか?

<div id="DIVID" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Text 1
  <br/>
  Text 2
  <br/>
  Text 3
  <br/>
  Text 4
 <br/>
 <b>Header 2</b>
</div>

ところで、あまり関係のない質問があります。上記とまったく同じように、すべてがhtmlにリンクするさまざまな数のリンクを持つWebサイトがあるとします。これはこのアプリケーションではありませんが、craigslist を考えてみてください。中央のページには多数のリンクがあります。解析を行うには、これらの各ページにアクセスできる必要があります。これを行うための良いアプローチは何でしょうか?

ありがとう!

追加: 次の Web ページは次のようになります。

<div id="DIVID2" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Different Text 1
  <br/>
  Different Text 2
 <br/>
 <b>Header 2</b>
</div>

違いに注意してください。

  1. DIVID は DIVID2 になりました。ページの他の解析に基づいて、DIVID の末尾を把握できます。これは問題ではありません。

  2. テキストの項目が 4 つではなく 2 つしかありません。

  3. 現在のテキストは異なります。

主な類似点に注意してください。

  1. ヘッダー 1 とヘッダー 2 は同じです。これらは変わりません。
4

3 に答える 3

2

を使用してすべてを組み合わせることができますget_text

test ="""<div id='DIVID'>
<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>
</div>"""

def divid(tag):
    return tag.name=='div' and tag.has_attr('id') and tag['id'].startswith('DIVID')

soup = BeautifulSoup(test)
print soup.find(divid).get_text()

それはあなたに与えるでしょう

ヘッダー 1

文1

テキスト 2

テキスト 3

テキスト 4

ヘッダー 2

于 2013-09-27T09:07:11.300 に答える
1

次のようなことを試してみてください:

>>> test ="""<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>"""
>>> soup = BeautifulSoup(test)

>>> test = soup.find('b')
>>> desired_text = [x.strip() for x in str(test.parent).split('<br />')]
['<b>Header 1</b>', 'Text 1', 'Text 2', 'Text 3', 'Text 4', '<b>Header 2</b>']

これで、「ヘッダー」ブロックで区切るだけで済みます。これは実行可能であり、正しい方向に進む可能性があると思います。

他の質問については、リンクのリストを作成し、それらを繰り返して、それぞれを個別に開き、どのように処理するかを処理する必要があります。ただし、これはより広範な質問であるため、特定の問題について助けが必要な場合は、いくつかのことを試してから、自分が持っているものを改良し、新しい質問をする必要があります.


コードの最後の行の説明:

[x.strip() for x in str(test.parent).split('<br />')]

これは、上で割り当てた「テスト」ノードを取得し、親を取得します。文字列に変換することで、タグを「分割」でき<br>ます。これにより、これらのタグが消え、分離したいすべてのテキストが分離されます。これにより、各リスト項目に必要なテキストといくつかの '\n' が含まれるリストが作成されます。

最後に、おそらく最も紛らわしいのは、次のようなリスト内包表記の構文です。

some_list = [item for item in some_iterable]

これは、「some_iterable」からすべて取得された「アイテム」のリストを単純に生成します。私のリスト内包表記では、リストを実行し、リスト内の各項目を取得して、単純に改行 (x.strip()部分) を取り除きます。ところで、これを行うには多くの方法があります。

于 2013-09-26T21:27:18.697 に答える
1

ここに別の解決策があります。nextSibling は、名前付きタグに続く構造化文書の一部を取得できます。

from BeautifulSoup import BeautifulSoup

text="""
<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>
"""

soup = BeautifulSoup(text)

for br in soup.findAll('br'):
    following = br.nextSibling
    print following.strip()
于 2013-09-27T07:22:06.903 に答える