我想使用Scrapy对页面上的重复元素进行分组,但是对于这个特定的例子来说,没有缝合很多信息。也许你们中的一个人会很友善地帮助我解决这个问题。
HTML
这是我希望使用Scrapy抓取的页面上的当前HTML标记:
###############
# First group #
###############
<table>
<tbody>
<tr>
<td>Heading1</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>
<table>
<tbody>
<tr>
<td><a href="Foo1URL">Foo1</a></td>
<td>Bar1</td>
</tr>
<tr>
<td><a href="Foo2URL">Foo2</a></td>
<td>Bar2</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td><a href="Foo3URL">Foo3</a></td>
<td>Bar3</td>
</tr>
<tr>
<td><a href="Foo4URL">Foo4</a></td>
<td>Bar4</td>
</tr>
</tbody>
</table>
...
</td>
<td>
<table>
<tbody>
<tr>
<td>Sub-Heading1</td>
</tr>
<tr>
<td>Name1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>Name2</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>Name3</td>
<td>3</td>
<td>3</td>
<td>3</td>
</tr>
...
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
################
# Second group #
################
<table>
<tbody>
<tr>
<td>Heading2</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>
<table>
<tbody>
<tr>
<td><a href="Foo5URL">Foo5</a></td>
<td>Bar5</td>
</tr>
<tr>
<td><a href="Foo6URL">Foo6</a></td>
<td>Bar6</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td><a href="Foo7URL">Foo7</a></td>
<td>Bar7</td>
</tr>
<tr>
<td><a href="Foo8URL">Foo8</a></td>
<td>Bar8</td>
</tr>
</tbody>
</table>
...
</td>
<td>
<table>
<tbody>
<tr>
<td>Sub-Heading2</td>
</tr>
<tr>
<td>Name4</td>
<td>4</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>Name5</td>
<td>5</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>Name6</td>
<td>6</td>
<td>6</td>
<td>6</td>
</tr>
...
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
################
# Third group #
################
# ... and so on
请注意:'...'表示它会在每个页面的变量实例处重复。
数据结构
这就是HTML标记中的上述数据的结构:
--- Heading1
--|--
-|- Foo1 (Foo1URL)
|- Bar1
-|- Foo2 (Foo2URL)
|- Bar2
|--
-|- Foo3 (Foo3URL)
|- Bar3
-|- Foo4 (Foo4URL)
|- Bar4
|--
-| ...
--|-- Sub Heading1
|- Name1
|- 1
|- 1
|- 1
|- Name2
|- 2
|- 2
|- 2
|- Name3
|- 3
|- 3
|- 3
|--
-| ...
--- Heading2
--|--
-|- Foo5 (Foo5URL)
|- Bar5
-|- Foo6 (Foo6URL)
|- Bar6
|--
-|- Foo7 (Foo7URL)
|- Bar7
-|- Foo8 (Foo8URL)
|- Bar8
|--
-| ...
--|-- Sub Heading2
|- Name4
|- 4
|- 4
|- 4
|- Name5
|- 5
|- 5
|- 5
|- Name6
|- 6
|- 6
|- 6
|--
-| ...
--- HeadingX
--|-- ...and so on
结构在页面和其他页面上重复出现,因此页面上可以有X个这样的组。
示例废料数据
这就是我想在页面上搜索的内容:
[ (Heading1, Foo1, Foo1URL, Bar1, Foo2, Foo2URL, Bar2),
(Heading1, Foo3, Foo3URL, Bar3, Foo4, Foo4URL, Bar4),
...
(Heading2, Foo5, Foo5URL, Bar5, Foo6, Foo6URL, Bar6),
(Heading2, Foo7, Foo7URL, Bar8, Foo8, Foo8URL, Bar8),
... ]
然后是子标题:
[ (Heading1, Sub-Heading1, Name1, 1, 1, 1),
(Heading1, Sub-Heading1, Name2, 2, 2, 2),
(Heading1, Sub-Heading1, Name3, 3, 3, 3),
...
(Heading2, Sub-Heading2, Name4, 4, 4, 4),
(Heading2, Sub-Heading2, Name5, 5, 5, 5),
(Heading2, Sub-Heading2, Name6, 6, 6, 6),
... ]
答案 0 :(得分:1)
在这种情况下,当难以区分html条目时,你可以尝试依靠元素位置,意思是这样的:
item = SomeItem()
item2 = SomeOtherItem()
for idx,t in enumerate(sel.xpath('/html/body/table')):
if not idx % 2:
item.field1 = t.xpath('tbody/tr/td/text()').extract()[0]
else:
content = t.xpath('tbody/tr/td[1]')
item.field2 = content.xpath('table/tbody/tr/td[1]/a/@href).extract()[0]
item.field3 = content.xpath('table/tbody/tr/td[2]/text()).extract()[0]
sub_heading = t.xpath('tbody/tr/td[2]')
item2.field1 = heading.xpath(...)
...
希望这会有所帮助。