【问题标题】:scrapy with newline characters and nested tags带有换行符和嵌套标签的scrapy
【发布时间】:2012-01-26 11:51:27
【问题描述】:

免责声明:scrapy 新手。

我有一个非常不规则行的表格,基本结构是:

<tr>
 <td> some text </td>
 <td> some other text </td>
 <td> yet some text </td>
</tr>

但偶尔(几百次)有些行是

<tr>
 <td> <p> some text <p> </td>
 <td> <div class="class-whateva"> <p> some other text </p></div> </td>
 <td> <span id="strange-id"> 
  <a href="somelink"> yet some text </a> 
    <span> </td>
</tr>

或 1 或 2 个嵌套的“p”“div”和“span”的其他排列,带或不带返回行字符。

我已经使用以下形式的条件语句处理了嵌套的“span span”或“p div”或“div span”:

for row in allrows:
      if  row.select('td[2]/text()'):
            item['seconditem']=row.select('td[2]/text()').extract()
      elif row.select('td[2]/*/text()'):
            item['seconditem']=row.select('td[2]/*/text()').extract()
      elif row.select('td[2]/*/*/text()'):
            item['seconditem']=row.select('td[2]/*/*/text()').extract()

现在我有两个问题:

(1) 是有条件的

td[2]/*/*/text()

不规则嵌套行的正确方法?

(2) 我仍然错过了标记前有返回(或换行符)的所有情况。 因此,如果该行是以下形式:

   <td><div>
      <p>text </p>
   </div></td>

我所有的 xpath 将返回一个 ['\n ']。有什么技巧可以捕捉换行符之后的内容?

感谢任何提示。谢谢。

【问题讨论】:

    标签: python xpath html-parsing scrapy


    【解决方案1】:

    您可以在XPath 表达式中使用string() 函数来获取一个字符串中的所有内部文本节点:

    # nested.html - your second html snippet
    # $scrapy shell "nested.html" 
    
    In [1]: row = hxs.select('//tr')
    
    In [2]: row.select('td[2]').select('string()').extract()
    Out[2]: [u'   some other text  ']
    
    In [3]: row.select('td[2]').select('string()').extract()[0]
    Out[3]: u'   some other text  '
    
    In [4]: row.select('td[3]').select('string()').extract()[0]
    Out[4]: u'  \r\n   yet some text  \r\n     '
    

    //text() 获取所有内部text 节点:

    In [5]: row.select('td[3]//text()').extract()
    Out[5]: [u' \r\n  ', u' yet some text ', u' \r\n    ', u' ']
    

    ''.join(...) 获取字符串:

    In [6]: ''.join(row.select('td[3]//text()').extract())
    Out[6]: u' \r\n   yet some text  \r\n     '
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2017-05-28
    • 2012-03-29
    相关资源
    最近更新 更多