2016-06-17 28 views
6

例HTMLBeautifulSoup CSSセレクタを使用してテキスト

<h2 id="name"> 
    ABC 
    <span class="numbers">123</span> 
    <span class="lower">abc</span> 
</h2> 

は、私のようなものと番号を取得することができます取得:

soup.select('#name > span.numbers')[0].text 

は、どのように私はBeautifulSoupとselect機能を使用してテキストABCを得るのですか?

この場合、どうなりますか?最初のケースで

<div id="name"> 
    <div id="numbers">123</div> 
    ABC 
</div> 

答えて

6

previous sibling取得:私はそれはあなたのことをここ意図的であることを前提としている

soup.select_one('#name > #numbers').next_sibling 

注:第2のケースで

soup.select_one('#name > span.numbers').previous_sibling 

を、next siblingを取得しますnumbersidの値であり、タグがの代わりにdivであること。したがって、私はCSSセレクタを調整しました。


両方のケースをカバーするために、あなたがタグの親に移動し、非再帰モードでの非空のテキストノードを見つけることができます。

parent = soup.select_one('#name > .numbers,#numbers').parent 
print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip()) 

は、セレクタの変化に注意してください - numbers idまたはnumbersクラスのいずれかに一致するように求めています。

しかし、私は、この普遍的な解決策は、信頼できるものではないと感じています。なぜなら、はじめに、あなたの実際のインプットがどんなものかを知ることができないからです。

+0

はい、idとdivとspanの変更は意図的でした。気づいてくれてありがとう!あなたの最後のソリューションのように親から始める方法はありますか?それとも、ケース#1の最初の子供か、ケース#2の2番目の子供のために直接選択しますか? findまたはfindAllの使用を避けようとしています。 – slaw

+0

@slawええ、確かに 'content'リスト' tag.contents [0] 'や' tag.contents [1] 'を使うことができます。あるいは、 'tag.children'ジェネレータを実行します。 – alecxe

関連する問題