5

を使用してHTMLを解析しようとしています

a = lxml.html.fromstring('<html><body><span class="cut cross">Text of double class</span><span class="cross">Text of single class</span></body></html>')
s1 = a.xpath('.//span[@class="cross"]')
s2 = a.xpath('.//span[@class="cut cross"]')
s3 = a.xpath('.//span[@class="cut"]')

出力:

s1 => [<Element span at 0x7f0a6807a530>]
s2 => [<Element span at 0x7f0a6807a590>]
s3 => []

しかし、最初の span タグにはクラス 'cut' がありますが、s3 は空です。s2 では、両方のクラスを指定すると、タグが返されます。

4

3 に答える 3

8

XPath の等号演算子は、左右のオペランドに正確に一致します。containsクラスの 1 つを検索する場合は、次の関数を使用できます。

a.xpath('.//span[contains(@class, "cut")]')

ただし、 のようなクラスに一致することもありcut2ます。

cssselectは、CSS セレクターを処理するライブラリです。pyqueryという名前のラッパーは、Python の JQuery ライブラリを模倣しています。

于 2013-01-21T15:54:51.260 に答える
2

classXPath クエリでは、CSS データ モデル (つまり、クラスは単一の属性内のスペースで区切られた値) に準拠していないことは確かです。必要なことを行うには、CSS セレクターの使用を検討する必要があります (たとえば、cssselectを介して)。

于 2013-01-21T15:49:39.273 に答える
1

Scharronによって引き起こされたcut2の問題を回避するために、クラスの前と最後にスペースを連結することができます。

a.xpath('.//span[contains(concat(" ", @class, " "), " cut ")]')
于 2013-01-21T20:27:20.537 に答える