6
html = """
...
<tt class="descname">all</tt>
<big>(</big>
<em>iterable</em>
<big>)</big>
<a class="headerlink" href="#all" title="Permalink to this definition">¶</a>
...
"""

bigタグが最初に出現する前までの開始タグの間のすべてのテキストを取得したいa。これは、この例を取り上げる(iterable)と、文字列として取得する必要があることを意味します。

4

4 に答える 4

6

反復アプローチ。

from BeautifulSoup import BeautifulSoup as bs
from itertools import takewhile, chain

def get_text(html, from_tag, until_tag):
    soup = bs(html)
    for big in soup(from_tag):
        until = big.findNext(until_tag)
        strings = (node for node in big.nextSiblingGenerator() if getattr(node, 'text', '').strip())
        selected = takewhile(lambda node: node != until, strings)
        try:
            yield ''.join(getattr(node, 'text', '') for node in chain([big, next(selected)], selected))
        except StopIteration as e:
            pass

for text in get_text(html, 'big', 'a'):
    print text
于 2012-08-04T14:25:40.153 に答える
4

<a>あなたの質問から、それが兄弟、親、または子要素にあるかどうかに関係なく、nextSibling まですべてを含めたいので、私は nextSibling を避けます。

<a>したがって、次の要素であるノードを見つけて、それまで再帰的にループし、遭遇した各文字列を追加するのが最善の方法だと思います。HTML がサンプルと大きく異なる場合は、以下を整理する必要があるかもしれませんが、次のようなものが機能するはずです。

from bs4 import BeautifulSoup
#by taking the `html` variable from the question.
html = BeautifulSoup(html)
firstBigTag = html.find_all('big')[0]
nextATag = firstBigTag.find_next('a')
def loopUntilA(text, firstElement):
    text += firstElement.string
    if (firstElement.next.next == nextATag):             
        return text
    else:
        #Using double next to skip the string nodes themselves
        return loopUntilA(text, firstElement.next.next)
targetString = loopUntilA('', firstBigTag)
print targetString
于 2012-08-04T13:59:44.323 に答える
1

あなたはこのようにすることができます:

from BeautifulSoup import BeautifulSoup
html = """
<tt class="descname">all</tt>
<big>(</big>
<em>iterable</em>
<big>)</big>
<a class="headerlink" href="test" title="Permalink to this definition"></a>
"""
soup = BeautifulSoup(html)
print soup.find('big').nextSibling.next.text

詳細は、こちらから BeautifulSoup での dom traversing を確認してください

于 2012-08-04T13:47:39.750 に答える
0
>>> from BeautifulSoup import BeautifulSoup as bs
>>> parsed = bs(html)
>>> txt = []
>>> for i in parsed.findAll('big'):
...     txt.append(i.text)
...     if i.nextSibling.name != u'a':
...         txt.append(i.nextSibling.text)
...
>>> ''.join(txt)
u'(iterable)'
于 2012-08-04T13:11:30.300 に答える