Scrapyは、ボンネットの下にlxml
を使用していることを考えると、それはlxml
は、テキストノードの一つにXML特殊文字<
が含まれているHTMLのこの種の、どのように処理するかを検査する価値があります上記のデモで
>>> from lxml import html
>>> raw = '''<div class="details_wrapper">
... <div class="detail">
... <b>Recommended length of visit:</b>
... <1 hour
... </div>
... <div class="detail">
... <b>Fee:</b>
... No
... </div>
... </div>'''
...
>>> root = html.fromstring(raw)
>>> print html.tostring(root)
<div class="details_wrapper">
<div class="detail">
<b>Recommended length of visit:</b>
<div class="detail">
<b>Fee:</b>
No
</div>
</div></div>
お知らせあなたが疑うように、テキストノード'<1 hour'
は、要素ソースroot
から完全になくなっています。それは、このHTMLの場合の取り扱いで、より合理的であるため、回避策として、(あなたがScrapy応答からsoup
を作成するためのresponse.body_as_unicode()
を渡すことができます)BeautifulSoup
を使用して検討してください。
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(raw, "html.parser")
>>> print soup.prettify()
<div class="details_wrapper">
<div class="detail">
<b>
Recommended length of visit:
</b>
<1 hour
</div>
<div class="detail">
<b>
Fee:
</b>
No
</div>
</div>
BSを使用してターゲットテキストノードは、次のように行うことができます検索:すでにscrapy
パーサParsel
に報告したように
>>> soup.find('b', text='Recommended length of visit:').next_sibling
u'\n <1 hour\n'
ありがとう:それはそこに言うように、あなたのクモは、このようなものでなければなりません
は、解決策は、セレクタに
type='xml'
引数を渡すことであろう!それは働いた:) –