【问题标题】:scrapy get nth-child text of same classscrapy获取同一类的第n个子文本
【发布时间】:2017-03-15 16:58:55
【问题描述】:

我附上了一张图片。 我面临的问题是获得同一类的第一个元素。我试图得到 .adxHeader > .adxExtraInfo (1st one) > .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()

预期输出:الرياض

<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>

【问题讨论】:

  • 什么不起作用? “输出:الرياض”是你想要的还是你得到的和不期望的?
  • @paultrmbrth,是的,我想要这个输出 الرياض 但得到 null
  • 请注意,CSS3 没有“1st of class”的选择器,只有父级下的第 N 个孩子,或第 N 个“标签”(如 Nth &lt;p&gt;,N-th @ 987654336@. CSS4 有 :nth-match 可以做到这一点(我认为),但它没有在 scrapy/parsel/cssselect 中实现
  • 您可能需要提供一些示例 HTML 输入。并检查页面的来源(如view-source:),而不是浏览器检查工具显示的内容。
  • 你的输出是什么?,你检查过是否没有 javascript 改变了 html 代码吗?,你能发布一个示例 url

标签: css python-3.x scrapy


【解决方案1】:

您可以使用 xpath 代替 css:

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

【讨论】:

    【解决方案2】:

    您定位的&lt;div class="adxExtraInfo"&gt; 不是其&lt;div class="adxHeader"&gt; 父级的第一个子级。 &lt;h3&gt; 是。 所以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>']
    >>> 
    

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

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

    【讨论】:

    • 这样,我需要将整个div放入选择器中。还有比这更好的方法吗?
    • 我在回答中使用的s 选择器只是为了模仿您在response 中的内容。您可以使用相同的div.adxHeader &gt; h3:nth-child(1) + div.adxExtraInfo div.adxExtraInfoPart:nth-child(1) a::textresponse.css()
    【解决方案3】:

    使用您的 sn-p 这应该提取您想要的内容(如果您使用 nth-child(1),它也可以工作:

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

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多