Scrapyを使用して、非常に意味のないテーブルを含む Web ページを解析したいと思います。私が探しているのは、「次の要素に一致するまで、次のすべての兄弟を印刷する」-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>
各ヘッダーの下にすべてのタイトル、名前、コメント、およびメモをグループ化したいと思います。following-sibling
さまざまな XPath ( 、preceding-sibling
およびのバリエーションcount
) を試してみましたが、何も得られないかtr
、ヘッダーではないすべてまたはすべてが得られます。
//tr[@style]
現在、またはでヘッダーを取得してい//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])]')