1

私はscrapyで遊んでいますが、scrapyをうまく活用するには、xpathの知識が不可欠であることがわかります。タグがそのようにフォーマットされている場所からいくつかの情報を収集しようとしているWebページがあります

<div id = "content">
  <h1></h1>
  <p></p>
  <p></p>
  <h1></h1>
  <p></p>
  <p></p>

これで、見出しにタイトルが含まれ、最初の「p」にはdata1が含まれ、2番目の「p」にはdata2が含まれます。これは非常に簡単な作業のように思えます。これが常に当てはまる場合は、問題はありませんhsx.select('//*[@id="content"]')

問題は、ヘッダーの後に2つではなく1つのpタグしかない場合があることです。

<div id = "content">
  <h1></h1>
  <p></p> (a)
  <h1></h1>
  <p></p> (b)
  <p></p> (c)

段落タグが欠落している場合は、その情報を空白のデータとしてリストに保存したいと思います。現在、リストには最初の見出し1、最初の段落タグ(a)、次に2番目のh1(b)の下の段落タグが格納されています。それがすべきことは保存することです

title -> h1[0]
data1[0] -> (a)
data2[0] ->[]

それが理にかなっていることを願っています。私はこれを行うための良いxpathまたはscrapyソリューションを探していましたが、それを見つけることができないようです。役立つヒントは素晴らしいでしょう。ありがとう

4

2 に答える 2

0

使用

//div[@id='content']
     /h1[1]/following sibling::*
             [not(position()>2)][self::p]

pこれにより、任意の最初のh1子の(最大の)2つの直接の兄弟要素が選択されます(これは1つのid 「content」`divである必要があることがわかっています。div) the string value of whoseattribute is

最初の直接の兄弟のみがである場合p、返されるノードリストには1つのアイテムのみが含まれます。

返されたノードリストの長さが1か2かを確認し、これを使用して処理の制御を構築できます。

于 2012-10-20T01:55:15.403 に答える
0

私はあなたがこのようなものが欲しいと思います。100%ではありません/テストされていません。

//h1/following-sibling::*[2][self::p]/text()|//h1[not(following-sibling::*[2][self::p])]/string('')
于 2012-10-20T01:55:41.087 に答える