【问题标题】:Scrapy Xpath How should I handle missing data between tags in a table?Scrapy Xpath 我应该如何处理表中标签之间的缺失数据?
【发布时间】:2014-11-12 08:26:46
【问题描述】:

您好,我正在使用 python 的 scrapy 从网站上抓取表格,所以我必须使用 scrapy 的 Selector xpath 来执行此操作。我正在考虑获取表格的所有数据内容,然后将其与表格标题一起压缩 (zip()),以便在我的最终数据中,表格的每个数据内容都与代表它的标签匹配。但是,我注意到表格的某些部分没有值.. 而不是

<td>24</td>

只是

<td></td> 

当我抓取时,scrapy 会跳过空标签并获取下一个值。这搞砸了我要压缩东西的方式,因为由于缺少值,所有内容都可能向左移动一个或多个。所以..有没有办法让scrapy的Selector xpath返回某种缺少的空标识符,这样我就可以解释丢失的信息?或者也许有更好的方法来解决我的问题,从而防止这个问题发生?谢谢!

编辑: xpath 看起来像...

Selector(response).xpath("tbody/tr/td/text()").extract()

【问题讨论】:

    标签: python xpath web-scraping scrapy


    【解决方案1】:

    这个呢?

    values = [''.join(td.xpath('.//text()').extract()) for td in Selector(response).xpath('//tbody/tr/td')]
    

    解释:

    ''.join 和 extract() 结果

    对于&lt;td&gt;123&lt;/td&gt; 情况:xpath('//td/text()').extract() 返回 [u'123']

    对于&lt;td&gt;&lt;/td&gt; 情况:xpath('//td/text()').extract() 返回 []

    ''.join([u'123']) ==> u'123'

    ''.join([]) ==> u'' //空字符串

    选择器链

    selector.xpath('//td/text()') 等于 selector.xpath('//td').xpath('.//text()')

    选择器循环

    values = []
    for td in s1.xpath('//td'):
        # td is a selector with single element
        # so that it will not return a list with multiple values ['value1', 'value2']
        # selector.xpath('.//text()') just two cases: 
        # 1) []  <td><td>
        # 2) [u'values']  <td>values<td>
        value = ''.join(td.xpath('.//text()').extract()) 
        # returns '' or 'values'
        values.append(value)
    

    这是我的测试代码

    s1= Selector(text='<div><span></span><span>232</span><span>haha<span><span></span></div>')
    
    values = [''.join(text.xpath('.//text()').extract()) for text in s1.xpath('//span')]
    \# values: ['', u'232', u'haha', '', '']
    

    【讨论】:

    • td.xpath 中的 td 指的是什么? “tbody/tr/”的前面 xpath 的东西?我假设了这一点,并用我的代码尝试了等价的代码,得到了一个非常长的数字列表,所有的值都相同。所以这不太正确。
    • 哦等等,我有几个错别字,所以现在可以了!甜的!但我只是有点理解它为什么起作用..愿意解释一下吗?谢谢!!
    • 一个更快速的问题.. 有没有简单的方法或最后一个元素?比如说我想从 div/span/a 中获取 a,从 div/span/b 中获取 b。我知道工会 |但是当我使用它时,我一直在写出整个路径两次。有没有类似 div/span/(a|b) 的东西?
    • 我问这个是因为我想将您提供给我的内容用于在 tbody/tr 之后,我想要的文本位于 td 或 th/a 中的场景,所以我认为解决这个问题会有点棘手。
    • 解决我关于 a|b 的问题并没有真正帮助.. 我想我也想问的是.. 有没有办法保持检查空值,但是改变通过让 for 循环中的 td 能够成为各种事物,for 循环是如何工作的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2013-01-02
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多