ChicoId
@ChicoId
IT Specialist

Как разделить данные с ячеек из таблицы с помощью Xpath?

Имеется следующая html таблица :
<table class="info">
<tbody>
    <tr><td class="name">Year</td><td>2011</td></tr>
    <tr><td class="name">Storey</td><td>3</td></tr>
    <tr><td class="name">Area</td><td>170</td></tr>
    <tr><td class="name">Condition</td><td>Renovated</td></tr>
    <tr><td class="name">Bathroom</td><td>2</td></tr>
</tbody>
</table>

В данной таблице информация организована таким образом, что каждая строка содержит две ячейки, заключенные в тегах <td>. Первая ячейка содержит информацию о типе данных. Например, год постройки (Year). Вторая ячейка содержит непосредственно год (2011).

Я хочу извлечь данные в таком виде, что тип данных и сама информация были разделены, и информация с ячеек соответствовали друг другу примерно таким образом:
Year: 2011
Storey: 3
Area: 170
Condition: Renovated
Bathroom: 2

Хочу получить каждую строчку и данные с ячеек так, чтобы информацию можно было разнести по разным колонкам в Excel. Данные о типе в первой колонке и сами данные во второй колонке.

На данный момент имеется следующий Xpath код:

//table[@class="info"]//tr//td/text()

Он возвращает данные в едином потоке в следующем формате:

Year
2015
Storey
3
Area
170
Condition
Renovated

Я хотел бы извлечь строки и ячейки соответственно, чтобы можно было поместить их в Excel таблицу по разным колонкам:

Year (1-й excel столбец): 2011 (2-й excel столбец)
Storey (1-й excel столбец): 3 (2-й excel столбец)

Как сделать это с помощью Xpath?
  • Вопрос задан
  • 2149 просмотров
Решения вопроса 1
@throughtheether
human after all
//table[@class="info"]//tr//td/text()
С какой целью вы используете "//" между tr и td, если td - непосредственный потомок tr? На мой взгляд, лучше указывать максимально специфичное xpath-выражение. Также просьба уточнить, в какой среде (язык программирования) вы используете эти выражения.

Если вы перепишете ваше выражение так:
//table[@class="info"]/tbody/tr/td[1]/text(), вы получите значения
Year, Storey, Area, Condition, Bathroom.

Аналогично
//table[@class="info"]/tbody/tr/td[2]/text() даст
2011, 3, 170, Renovated, 2.
Далее можете совместить оба списка при помощи используемого вами языка программирования.

Или можете получить список нод - строк таблицы:
//table[@class="info"]/tbody/tr и далее, итерируя по ним, получать значения выражений td[1]/text() и td[2]/text().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы