使用Scrapy我想解析一个包含非常无语义表的网页。我正在寻找的是“打印每个后续兄弟,直到遇到以下元素”-XPath-query。
<table>
<tr>
<th>Title</th>
<th>Name</th>
<th>Comment</th>
<th>Note</th>
</tr>
<tr style="background-color:#CCDDEF;">
<td colspan="4"> <b>HEADER1</b></td>
</tr>
<tr>
<td>Title1.1</td>
<td>-</td>
<td>Info1.1</td>
<td></td>
</tr>
<tr style="background-color:#CCDDEF;">
<td colspan="4"> <b>HEADER2</b></td>
</tr>
<tr>
<td>Title2.1</td>
<td>Name2.1</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Title2.2</td>
<td>Name2.2</td>
<td>Info2.2</td>
<td></td>
</tr>
<tr style="background-color:#CCDDEF;">
<td colspan="4"> <b>HEADER3</b></td>
</tr>
<tr>
<td>Title3.1</td>
<td>Name3.1</td>
<td></td>
<td></td>
</tr>
</table>
我想在每个标题下对每个标题、名称、评论和注释进行分组。我尝试过使用各种 XPath(带有 和 的变体)following-sibling
,但要么一无所获,要么一无所有,要么每一个都不是标题。preceding-sibling
count
tr
我目前正在使用//tr[@style]
or获取标题//tr[td[@colspan="4"]]
。
以下是我的 Scrapy-spider 中的解析函数(它打印标题和所有tr
不是标题的 's):
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//*[@id="content-text"]//tr[td[@colspan="4"]]')
for site in sites:
print site.select('./td/b/text()').extract()
print site.select('./following-sibling::tr[not(td[@colspan])]')