【问题标题】:Scrapy Python xpath for <mark><mark> 的 Scrapy Python xpath
【发布时间】:2018-04-10 16:45:02
【问题描述】:

我想在 Scrapy 上用 .xpath 或 .css 提取标签中包含的一些信息。

但我想设置一些条件,但我不知道该怎么做。 例如,让我们看看我要废弃的网页的这个 HTML 代码。

<div data-tabs-content="" class="estateTabs-panels">
  <div id="detail" data-tabs-pane="" class="estateTabs-panel active">
   <ul class="dotted-list dotted-list--ocom">
    <li><mark>Nombre de pièce(s)
     </mark> <mark>3</mark>
    </li>
    <li>
    <li><mark>Nombre de chambre(s)</mark>
    <mark>2</mark>
    </li>                              
    <li> 
    <mark>Surface</mark>
    <li><mark>70.68m²</mark>
    </li>

我的问题是对于网站的每个页面,&lt;mark&gt; 标签内的值是不同的,我想提取,例如,对于&lt;mark&gt;2&lt;/mark&gt;,如果前一个标记标签包含“Nombre de chambre(s) ”。

例如,我想做这样的事情:

if elt.css(".XXXX").extract_first() == ' Nombre de chambre(s) ':
       item['value'] = elt.css(".XXXX").extract_first() 

结果必须是2

目前我可以用这种方式报废:

item['value'] = info.css('.estateTabs-panel ::text').extract()[4]

但我不想使用[int],因为每个页面的值都不同。

标记标签可以吗?

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    您可以直接在 xpath 查询中创建条件:

    import scrapy
    
    html = '<div data-tabs-content="" class="estateTabs-panels"> ' \
           '<div id="detail" data-tabs-pane="" class="estateTabs-panel active">' \
           '<ul class="dotted-list dotted-list--ocom">' \
           ' <li><mark>Nombre de pièce(s)' \
           '</mark> <mark>3</mark>' \
           '</li>' \
           '<li>' \
           '<li><mark>Nombre de chambre(s)</mark>' \
           '<mark>2</mark>' \
           '</li>' \
           '<li>' \
           '<mark>Surface</mark>' \
           '<li><mark>70.68m²</mark>' \
           '</li></ul></div></div>'
    
    response = scrapy.Selector(text=html, type="html")
    
    text = response.xpath("//*[contains(text(), 'Nombre de chambre(s)')]/following-sibling::mark/text()")
    
    print(text.get())
    

    返回:

    2
    

    xpath 查询正在寻找包含“Nombre de chambre(s)”的元素。如果找到它,它将获得以下“标记”元素。将从该元素中获取文本。

    干杯:)

    【讨论】:

      【解决方案2】:

      如果您想使用selector 做同样的事情,那么您也可以尝试:

      import scrapy
      
      htmldoc="""
      <div data-tabs-content="" class="estateTabs-panels">
        <div id="detail" data-tabs-pane="" class="estateTabs-panel active">
         <ul class="dotted-list dotted-list--ocom">
          <li><mark>Nombre de pièce(s)
           </mark> <mark>3</mark>
          </li>
          <li>
          <li><mark>Nombre de chambre(s)</mark>
          <mark>2</mark>
          </li>                              
          <li> 
          <mark>Surface</mark>
          <li><mark>70.68m²</mark>
          </li>
          </ul>
         </div>
        </div>
      """
      res = scrapy.Selector(text=htmldoc)
      text = res.css("mark:contains('Nombre de chambre') + mark::text").extract_first()
      print(text)
      

      输出:

      2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        相关资源
        最近更新 更多