scrapy与换行符和嵌套标签

2 投票
1 回答
3110 浏览
提问于 2025-04-17 11:08
td[2]/*/*/text()

免责声明:我刚接触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) 使用条件语句处理不规则嵌套行是正确的方法吗?

(2) 我仍然缺少所有在标签前有换行符的情况。所以如果这一行的形式是:

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

我所有的xpath返回的结果就是['\n ']。有没有什么技巧可以捕捉到换行符后面的内容?

任何建议都很感谢。谢谢。

1 个回答

3

你可以在 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     '

撰写回答