我在网站上遇到了复杂的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>
它的噩梦般的结构!并反复出现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
格中提取文本。我可以使用extract()[++i]
来增加它,但这不是最佳解决方案,我认为肯定有更好的方法来实现它。
我想完成的是:
依次从每个列表_ *中提取文本(PRODUCT_NAME)。
答案 0 :(得分:0)
也许尝试像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()
答案 1 :(得分:0)
为什么找不到所有链接并从中提取文本
response.xpath('//a[@class="product_title"]/text()').extract()