Xpath - 包含文本值的表的多个嵌套div

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xpath - 包含文本值的表的多个嵌套div相关的知识,希望对你有一定的参考价值。

我在网站上遇到了复杂的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()
另一答案

为什么不找到所有链接并从中提取文本

response.xpath('//a[@class="product_title"]/text()').extract()

以上是关于Xpath - 包含文本值的表的多个嵌套div的主要内容,如果未能解决你的问题,请参考以下文章

声明一个对象类型的表,其中对象包含两个嵌套表

具有产品 ID 和该 ID 的多个值的表的 Sql 查询

如何使用 XML::XPath 获取属性?

硒问题尝试使用 driver.findElement(By.xpath() 从 div 检索文本

如何仅抓取多个div中的文本内容[重复]

XPath 在不同元素上有多个包含