2017-09-19 5 views
0

「id」とアンカータグに対応する値を取得したいと思います。idに対応する値を取得する方法

<li id="1" class="list"> 
    <a class="tim">This is Link1</a> 
<li id="2" class="list"> 
    <a class="tim">This is Link2</a> 
<li id="3" class="list"> 
    <a class="tim">This is Link3</a> 

私は以下のコードで試してみました:

from scrapy.http import HtmlResponse 
response = HtmlResponse(url="some url", body=htmltext, encoding='utf8') 

for x in response.css('li::attr(id)').extract(): 
    item = {} 
    item['id'] = x 
    item['value'] = x.css('a.tim::text').extract() 

が、それは私の最後の行のためのAttributeError: 'unicode' object has no attribute 'css'を提供します。

>>> response.css('li::attr(id)').extract() 
['1', '2', '3'] 

は、ループを展開しないでください、あなたはli要素(ない属性)を選択する必要があり、その後、ループ:

+0

ここでどのようなタイプのオブジェクトが「応答」ですか?あなたは図書館を使用していますか?その図書館は何ですか? –

+0

私は治療リクエスト – michael

+1

を使用しています。質問に[mcve]の何かを追加しようとしました。実際に問題を再現して助けてくれます。 *質問するときは、文脈が重要です。 –

答えて

1

extract()を使用すると、属性値のリストを持っているので、属性の値を抽出し、代わりにSelectorインスタンス上:

for x in response.css('li[id]'): # li elements that have an id attribute 
    item = { 
     'id': x.css('::attr(id)').extract_first(), 
     'value': x.css('a.tim::text').extract_first(), 
    } 

これは必要idvalue属性を持つ辞書を作成します

>>> for x in response.css('li[id]'): # li elements that have an id attribute 
...  item = { 
...   'id': x.css('::attr(id)').extract_first(), 
...   'value': x.css('a.tim::text').extract_first(), 
...  } 
...  print(item) 
... 
{'id': '1', 'value': 'This is Link1'} 
{'id': '2', 'value': 'This is Link2'} 
{'id': '3', 'value': 'This is Link3'} 
関連する問題