2016-12-09 8 views
0

次の2つのコードスニペットが異なる出力を与えるのはなぜですか?唯一の違いは、最初のケースのh1タグが、2番目のケースのhタグに置き換えられている点です。これは、h1タグにhtmlの特別な「意味」があるためですか?私はh1からh6まで試してみましたが、どれもh7で出力として[u'xxx']と出てくる間に、すべて出力として[]を与えました。h1-h6タグでのscrapy xpathセレクタの動作

from scrapy import Selector # scrapy version: 1.2.2 

text = '<h1><p>xxx</p></h1>' 
print Selector(text=text).xpath('//h1/p/text()').extract() 
Output[1]: [] 

text = '<h><p>xxx</p></h>' 
print Selector(text=text).xpath('//h/p/text()').extract() 
Output[2]: [u'xxx'] 

答えて

3

の中にpタグを含めたものは、W3Cでは無効です。

sel = Selector(text="anyxml", type="xml") 

これは、任意のXML構造を尊重します:あなたはこれを回避し、ちょうどあなたがちょうどこのようtypeを変更することができます任意のxml構造で動作するように、とにかくこのhere

についての詳細を見ることができます。

1

短い答えはh1 ... h6は、整形式のHTMLドキュメントにHTMLを解析するときに好きではない(力Scrapyセレクタ)少なくともlxmlのを<p>を含むべきではないということです。 lxmlは不正なフォーマットを処理しますが、この場合は少し異なります。

あなたはどのようにlxmlの構文解析とHTMLスニペットをバックシリアライズ確認することができます:lxmlのはh1pタグに遭遇したとき

>>> from scrapy import Selector 
>>> text = '<h1><p>xxx</p></h1>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h1></h1><p>xxx</p></body></html> 

だから、それはそれの後にそれを置きます。 p要素は失われていませんが、HTMLソースを読むときに期待する場所ではありません。他のスニペット対

>>> text = '<h><p>xxx</p></h>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h><p>xxx</p></h></body></html> 
>>> 

h要素はlxmlのために特別なことを意味するものではありませんので、 "hpは" OKです。

+0

印刷物(s.extract())が何を伝えてくれてどうもありがとう! – FJDU