我有一个网站,我想使用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 24
</span>
<span property="v:datestart" content="2014-03-25">
Mar 25
</span>
</div>
</td>
</tr>
</div>
答案 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">