テキスト情報を抽出したいウェブサイトで複雑なhtml構造に遭遇しました。
ウェブサイトの構造は次のとおりです。
<ul class = "listing_pages">
<li id = "list_1" style = ""></li>
<li id = "list_2" style = ""></li>
<li id = "list_3" style = ""></li>
<li id = "list_4" style = ""></li>
<li id = "list_5" style = ""></li>
<li id = "list_6" style = ""></li>
<li id = "list_7" style = ""></li>
<li id = "list_8" style = ""></li>
<li id = "list_9" style = ""></li>
</ul>
それぞれがid="list_*"
展開します
<li id="list_1">
<div class="description_block">
<table valign="top">
<tbody>
<tr valign="top">
<td width="400px">
<table>
<tbody>
<tr>
<td style="width:350px">
<div></div>
<table></table>
<table cellspacing="0">
<tbody>
<tr>
<td height="15px">
<h2>
<a class="product_title" title="PRODUCT_NAME" href="http://example.com">PRODUCT_NAME</a>
その悪夢のような構造!そして、それはeatchのために繰り返されましたlist_*
以下の相対Xpathは
/div[9]/div[2]/div[3]/div[2]/form/div/div[2]/ul/li[1]/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td/table[2]/tbody/tr/td/h2/a
どちらが失敗します。
私が試したいくつかのことは、限られた成功でしたが、
response.xpath('//*[@id="one"]//table//tr//h2//a[position()]//text()').extract()
これ/h2/a
は、単一からではなく、ページからすべてを抽出しますlist_*
response.xpath('//*[@id="list_1"]//table//tr//h2//a//text()').extract()
これにより、テキストが正しく抽出されますが、最初のlist_1
divからのみ抽出されます。でインクリメントすることはできますextract()[++i]
が、それは最適な解決策ではなく、間違いなくより良い方法があると思います。
私が達成したいのは:
各list_ *からテキスト(PRODUCT_NAME)を順番に抽出します。
たぶん次のcss
ようなセレクターを試してみてください:response.css('li[id*="list_"] a.product_title::text').extract()
?またはxpath response.xpath('//li[contains(@id, "list_")]//a[contains(@class, "product_title")]/text()')
?
UPD:反復の場合:
for item in response.css('li[id*="list_"]'):
print item.css('a.product_title::text').get()
または
for item in response.xpath('//li[contains(@id, "list_")]'):
print item.xpath('.//a[contains(@class, "product_title")]/text()').get()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加