python - scrapy 带有换行符和嵌套标签

标签 python xpath html-parsing scrapy

免责声明: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 ']。有什么技巧可以捕捉换行符后面的内容吗?

任何提示表示赞赏。谢谢。

最佳答案

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

关于python - scrapy 带有换行符和嵌套标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9017738/

相关文章:

php - 解析这个 HTML

python - 在 Django 中获取当前服务器 ip 或域

python - 使用 Pandas 时 dateutil.tz 包显然丢失了?

php - 在 xpath 中合并两个 DOMNodeLists

javascript - 如何等待网站加载元素的 xpath

python - 使用 Python 2.7 解析 HTML - HTMLParser、SGMLParser 或 Beautiful Soup?

JavaScript 输入验证

python - 如何按文件扩展名类型列表在 s3 boto 过滤器对象中进行过滤

xml - 为什么 xpath 位置选择表达式会返回多个节点?

python - 在循环中查找漂亮的汤返回 TypeError