scrapy获得同一类的n-child文本

时间:2017-03-15 16:58:56

标签: css python-3.x scrapy

我附上了一张照片。 我面临的问题是获得同一类的第一个元素。我想要的 !powershell -command {<insert-your-command-here>}&gt; .adxHeader&gt; .adxExtraInfo (1st one)&gt; .adxExtraInfoPart (1st one)

我写了以下代码但没有工作。有什么想法吗?

a::text

预期输出:response.css('div.adxViewContainer div.adxHeader div.adxExtraInfo:nth-child(1) div.adxExtraInfoPart:nth-child(1) a::text').extract_first()

enter image description here

enter image description here

الرياض

3 个答案:

答案 0 :(得分:4)

您可以使用xpath代替css:

response.xpath('(//div[@class="adxExtraInfo"])[1]//a/text()').extract_first()

答案 1 :(得分:1)

您要定位的<div class="adxExtraInfo">不是其<div class="adxHeader">父母的第一个孩子。 <h3>是。{ 因此div.adxExtraInfo:nth-child(1)与输入中的任何内容都不匹配:

>>> s = scrapy.Selector(text='''<div class="adxHeader">
...         <h3 itemprop="name"> »  درج داخلي للاجار جديد حي المونسيه</h3>
... 
...                             <div class="adxExtraInfo">
...                                 <div class="adxExtraInfoPart"><a href="/city/الرياض"><i class="fa fa-map-marker"></i> الرياض</a></div>
...                                 <div class="adxExtraInfoPart"><a href="/users/ابو نوره"><i class="fa fa-user"></i> ابو نوره</a></div>
...                             </div>
... 
...                             <div class="adxExtraInfo">
...                                 <div class="adxExtraInfoPart"> قبل  ساعه و 27 دقيقه</div>
...                                 <div class="adxExtraInfoPart">#20467014</div>
...                             </div>
...                             <div class="moveLeft">
... 
... 
...                                 <a href="www.google.com" class="nextad"> &#8592; التالي      </a>
...                                           <br />
... 
...                             </div>
... 
...         </div>''')

>>> s.css('div.adxHeader > div.adxExtraInfo:nth-child(1)').extract()
[]
>>> s.css('div.adxHeader > *:nth-child(1)').extract()
[u'<h3 itemprop="name"> \xbb  \u062f\u0631\u062c \u062f\u0627\u062e\u0644\u064a \u0644\u0644\u0627\u062c\u0627\u0631 \u062c\u062f\u064a\u062f \u062d\u064a \u0627\u0644\u0645\u0648\u0646\u0633\u064a\u0647</h3>']
>>> 

但在这种情况下,您可能希望使用div.adxExtraInfo锚定<h3>,使用Adjacent sibling combinator(换句话说,<div class="adxExtraInfo">紧跟<h3>之后}):

>>> print(
...     s.css('''div.adxHeader
...                 > h3:nth-child(1) + div.adxExtraInfo
...                     div.adxExtraInfoPart:nth-child(1) a::text''').extract_first())
 الرياض
>>> 

答案 2 :(得分:0)

使用您的代码段,这应该提取您想要的内容(如果您使用nth-child(1),它也会有效:

response.css('.adxExtraInfoPart:first-child > a::text').extract()