1
hxs.select("//h:h2[re:test(., 'a', 'i')]").extract()


Undefined namespace prefix
xmlXPathEval: evaluation failed
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/scrapy/selector/libxml2sel.py", line 44,     in select
raise ValueError("Invalid XPath: %s" % xpath)
ValueError: Invalid XPath: //h:h2[re:test(., 'a', 'i')]

XPathとScrapyは初めてです。

どうしたの?(「a」という単語を含むノードを選択しようとしています)。

4

1 に答える 1

3

トレースバックによると、未定義の名前空間プレフィックスを使用していますre。私はscrapyに精通していませんが、名前空間プレフィックスをどこかに定義する必要があるようです。

ところで、あなたが使おうとしている関数は呼ばれていませmatchesんか?

あなたはそれをこのように呼ぶことができます://h:h2[matches(., 'a', 'i')]

代替案は //h:h2[contains(lower-case(.),'a')]

また、あなたが言ったこと(

どうしたの?(「a」という単語を含むノードを選択しようとしています)。

)関数のセマンティクスと矛盾します。スニペットでは、実際には文字aを含む文字列を探しています。言葉としてではありません。

要素内の唯一のテキストである場合は、次を使用することもできます。 //h:h2[lower-case(.)='a']

または、長いテキスト内の単語としてaを探している場合は、の使用matchesXPath正規表現を組み合わせることができます。

于 2012-06-21T19:11:30.903 に答える