Запрос xPath для извлечения имен, которые могут быть в элементе <a>и могут быть только в элементе <td> - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь извлечь из таблицы названия городов футбольных команд. Я использую python библиотеки l xml и запросы. некоторые элементы содержат свои имена в форме элемента name, а некоторые только с именем

, например, Arsenal form -> принадлежит London, а имя London помещено внутри

Element='<tr>
   <td>
      <a href="/wiki/Arsenal_F.C." title="Arsenal F.C.">Arsenal</a>
   </td>
   <td>
      <a href="/wiki/London" title="London">London</a> 
      <span style="font-size:85%;">(<a href="/wiki/Holloway,_London" title="Holloway, London">Holloway</a>)</span>
   </td>
   <td>
      <a href="/wiki/Emirates_Stadium" title="Emirates Stadium">Emirates Stadium</a>
   </td>
   <td style="text-align:center">
      <span data-sort-value="7004607040000000000♠">60,704</span>
   </td>
</tr>'

и "Челси", который также принадлежит к Лондону, но не находится в нем, поскольку автор уже дал ссылку на упоминание Лондона в элементе "Арсенала".

Element='<tr>
   <td>
      <a href="/wiki/Chelsea_F.C." title="Chelsea F.C.">Chelsea</a>
   </td>
   <td>London <span style="font-size:85%;">(<a href="/wiki/Fulham" title="Fulham">Fulham</a>)</span>
   </td>
   <td>
      <a href="/wiki/Stamford_Bridge_(stadium)"
         title="Stamford Bridge (stadium)">Stamford Bridge</a>
   </td>
   <td style="text-align:center">
      <span data-sort-value="7004408340000000000♠">40,834</span>
   </td>
</tr>'

В настоящее время мой XPath-запрос для получения имен //table[2]/tbody//tr[position() > 1]//td[2]/a/text()

, но, очевидно, он не дает мне название города Челси, как я спрашиваю только для текстовых мест в элементе. Кроме того, мне нужно, чтобы они были в порядке расположения футбольных команд в таблице, чтобы их не было в двух разных списках.

Есть ли удобный способ сделать это?

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

Если я правильно вас понимаю, это ваш xpath:

//tr/td[2]/(text(),a/text())

Вывод:

London
London 
1 голос
/ 27 апреля 2020

Два варианта с XPath 1.0. Один вкладыш:

//tr/td[2]/span/preceding::text()[position()=1 or position()=2][normalize-space()]

Выход: London London

Или используйте оператор |:

//tr/td[2]/a/text()|//tr/td[2]/text()[1][normalize-space()]

Выход: London London

0 голосов
/ 26 апреля 2020

Как насчет:

//td[position()=1 or position()=2]//text()

Получается:

Челси Лондон (Фулхэм)

и

Арсенал Лондон (Холлоуэй)

Затем вы можете использовать .split(), чтобы получить отдельные элементы из этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...