刮掉结构不佳的HTML

时间:2014-03-24 21:01:45

标签: python web-scraping scrapy

我有一个网站,我想使用Scrapy抓取,其结构显示在帖子的底部(标题为 HTML )。我希望只能提取第一个<td class="small-txt dkgrey-txt rightInfoTD">中包含的信息,即包含<span property ="">标记的信息。我目前正在使用以下代码片段来尝试仅抓取该数据

listings = selector.css("div.whenwhereContent")

        for listing in listings:
            for body in listing.css('td.small-txt.dkgrey-txt.rightInfoTD')

但是,由于有多个<td>个标签具有相同的td.small-txt.dkgrey-txt.rightInfoTD类(请参阅HTML代码底部的许可和故障单数据),因此我得到重复的结果。如何将for循环限制为仅包含正确数据的<td>标记,以避免此问题?

HTML

<div class="whenwhereContent">
    <table width="100%" cellpadding="0" cellspacing="5">    
        <tr>
            <td class="small-txt medgrey-txt leftLabelTD">
                WHERE
            </td>
            <td class="small-txt dkgrey-txt rightInfoTD">
                <span property="v:name">
                    Sound Academy
                </span>
                <span property="v:street-address">
                11 Polson
                </span>
                <span property="v:locality">
                    Toronto
                </span> 
                <span property="v:postal-code">
                M5A 1A4
                </span>
                <span property="v:tel" style="white-space: nowrap;">
                    416-461-3625
                </span> 
                info@sound-academy.com 
                <a href="http://sound-academy.com" style="font-weight:900">
                    <span property="v:url">
                        sound-academy.com
                    </span>
                </a>
            </td><
        </tr>

        <tr>
            <td class="small-txt medgrey-txt leftLabelTD">
                ADMISSION
            </td> 
            <td class="small-txt dkgrey-txt rightInfoTD">
                $39.50-$55
            </td>
        </tr>

        <tr>
            <td class="small-txt medgrey-txt leftLabelTD">
                TICKETS AT
            </td> 
            <td class="small-txt dkgrey-txt rightInfoTD">
                LN, RT, SS
            </td>
        </tr>

        <tr>
            <td class="small-txt medgrey-txt leftLabelTD">
                WHEN
            </td>                                   
            <td class="rightInfoTD">
                <div class="small-txt dkgrey-txt">
                    <span property="v:datestart" content="2014-03-24">
                        Mar&nbsp;24
                    </span>  
                    <span property="v:datestart" content="2014-03-25">
                        Mar&nbsp;25
                    </span> 
                </div>
            </td>
        </tr>
</div>              

1 个答案:

答案 0 :(得分:1)

如果您想限制在第一个td中的tr,可以使用:nth-child() pseudo-class

listing.css('tr:nth-child(1) td.small-txt.dkgrey-txt.rightInfoTD')

或等效地:

listing.css('tr:first-child td.small-txt.dkgrey-txt.rightInfoTD')

CSS选择器非常有用,通常更容易维护。但在某些情况下,XPath可能是实现某些特定选择的唯一方法。在您的情况下,选择包含td的{​​{1}}可以执行类似

的操作
<span property="v:name">