Xpath - несколько вложенных div с таблицами, содержащими текстовое значение - PullRequest
0 голосов
/ 19 февраля 2019

Я столкнулся со сложной структурой 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 дел.Я могу увеличить его на extract()[++i], но это не оптимальное решение, и я думаю, что определенно есть лучшие способы сделать это.

Что я хочу сделать, это:

Извлечь текст (PRODUCT_NAME) из каждого списка _ * по порядку.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Почему бы не найти все ссылки и извлечь текст из

response.xpath('//a[@class="product_title"]/text()').extract()
0 голосов
/ 19 февраля 2019

Может быть, попробовать 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()
...