免责声明: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/