2016-05-03 34 views
2

私は掻き集めようとしているウェブサイトを持っていますが、私は読書をしていくつかの進歩を遂げました。それは厄介なサイトだが、重要な部分は、次のようになります。lxml、python、.tailでHTMLを解析すると、<br>タグで区切られます。

<h1> 
    <b>DESCRIPTOR1: </b> 
     " important content " 
    <br> 
    <b>DESCRIPTOr2: </b> 
     " important content" 
    <hr> 
</h1> 

<b>Title1</b> 
    " A lot of important text" 
<br> 
<br> 
<b>Title2</b> 
    "A lot of important text" 
<br> 
<br> 
<b>Title3</b> 
<br> 
    "1. List of text pertaining to Title3 " 
<br> 
    "2. List of items for Title 3" 
<br> 
    "3. the number of listed items is variable for every page" 
<br> 
    "4. Sometimes no list at all" 
<br> 
<br> 
<b> Next Title: </b> 

....and so on 

今、私は私がタイトル3に到達したとき、私の最終的な結果は以外になりたいものにかなり近い取得することができますし、コンテンツの前に<br>がありますそれは、これは私がそれに近づいていますどのようにあるタイトル3に行く:

import lxml.html 

htmltree = lxml.html.parse('sample.html') 

items = htmltree.xpath('//*[@id="sampletext"]/b') 

for node in items: 

    print (node.text.strip()) 
    print node.tail 

今私の2つの問題は、(1):私は.tail'sから空白を取り除くことができず、(2):私は「None」を取得していません次の要素の前に.tailがなく、<br>であるため、Title3のために返されました。理想的には、次のIdentifier-Tag(この場合は<b>)に到達するまで、要素タグの間にないテキストを追加することができます。希望は意味をなさない。すべてのポインタをお願いしますか?

答えて

2

あなたは次のXPath式使用して試すことができます

['" A lot of important text"'] 
['"A lot of important text"'] 
['"1. List of text pertaining to Title3 "', '"2. List of items for Title 3"', '"3. the number of listed items is variable for every page"', '"4. Sometimes no list at all"'] 
[] 
のXPathについて

簡単な説明:

質問にHTMLスニペットに対してテスト

for item in items: 
    result = item.xpath('following-sibling::text()[normalize-space()][preceding-sibling::b[1] = $b]', b=item) 
    print [r.strip() for r in result] 

出力を

  • following-sibling::text()[normalize-space()]:見つける空でない、以下、兄弟テキストノード...
  • [preceding-sibling::b[1] = $b] ...最寄りの先行兄弟b要素は$bに等しいです。 $bはXPathパラメータで、上記のコードでは現在のitemに置き換えられています。これはxpath()メソッドの第2パラメータ(b=item)によって示されます。
+0

ありがとうございます。私はそれを完全に理解していませんが(まだ)努力しています。プリントラインも私にとって混乱しています。これは、ブレークで区切られていても、次の 'b'要素まですべてが欲しい場合にはうまくいくが、その他のテキストではなく 'b'の直後に即時のものがほしい場合がある。私は番号がついたリストであるときに 'br'を無視しながら、次の 'b'まですべてを欲しいだけです。それを行う簡単な方法は? –

関連する問題