1

私は、scrapy を使用して、いくつかの奇妙な書式設定規則を持つサイトをクロールしています。基本的な考え方は、特定の div のすべてのテキストとサブ要素が必要であるということです。ただし、最初のいくつかと最後のいくつかを除きます。

これが要点です。

<div id="easy-id">
  <stuff I don't want>
  text I don't want
  <div id="another-easy-id" more stuff I don't want>

  text I want
  <stuff I want>
  ...
  <more stuff I want>
  text I want
  ...

  <div id="one-more-easy-id" more stuff I *don't* want>
  <more stuff I *don't* want>

注意: インデントは終了タグを意味するため、ここにあるものはすべて最初の div (id="easy-id" を持つもの) の子です。

テキストとノードが混在しているため、必要なものを取得するための単純な xpath セレクターを見つけることができませんでした。この時点で、xpath から結果を lxml.etree.elementTree として取得し、.remove() メソッドを使用してハッキングすることが可能かどうか疑問に思っています。

助言がありますか?

4

1 に答える 1

3

ID another-easy-id の div から one-more-easy-id div までのすべてが必要だと思います。

スタック オーバーフローはインデントを保持していないため、最初の div 要素の末尾がどこにあるかはわかりませんが、テキストの前で終わると推測します。

その場合、 //div[@id = 'another-easy-id']/following:node() [not(preceding::div[@id = 'one-more-easy-id']) とない (@id = 'もう 1 つ簡単な id')]

これが XHTML の場合、プレフィックス h などを XHTML 名前空間にバインドし、両方の場所で h:div を使用する必要があります。

編集:これが私が最後に行った構文です。(理由についてはコメントを参照してください。)

//div[@id='easy-id']/div[@id='one-more-easy-id']/preceding-sibling::node()[preceding-sibling::div[@id='another-easy-id']]
于 2012-08-30T03:26:37.443 に答える