xpath объединяет текст из нескольких элементов python - PullRequest
0 голосов
/ 09 ноября 2018

Здравствуйте, у меня есть html-файл с этого сайта: https://www.oddsportal.com/soccer/argentina/superliga/results/

<td class="name table-participant">
  <a href="/soccer/argentina/superliga/independiente-san-martin-tIuN5Umrd/">
    <span class="bold">Independiente</span>
    "- San Martin T."
  </a>
</td>

<td class="name table-participant">
  <a href="/soccer/argentina/superliga/lanus-huracan-xIDIe0Gr/">
    "Lanus - " 
    <span class="bold">Huracan</span>
  </a>
</td>

<td class="name table-participant">
  <a href="/soccer/argentina/superliga/rosario-central-colon-santa-fe-Q1Ye9Jpr/">Rosario Central - Colon Santa FE</a>
</td>

Я хочу выбрать и объединить / text () и span / text (), чтобы это выглядело так: «Independiente - San Martin T.» Как вы видите, «span» не всегда находится в одном и том же месте и иногда отсутствует (см. Последний «td class»)

Я использовал этот код:

('//td[@class="name table-participant"]/a/text() | span/text()').extract()

но возвращает только a / text (). Можете ли вы помочь мне сделать эту работу? Спасибо

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я предполагаю, что вы используете Scrapy для очистки HTML.

Из структуры вашего примера HTML похоже, что вы хотите получить текст элемента привязки, поэтому вам нужно выполнить итерации по ним.

Только тогда вы можете вырезать и объединить текстовые дочерние узлы элемента привязки для получения правильно отформатированных строк. Непоследовательное использование кавычек приводит к дополнительным осложнениям, но следующее должно помочь вам.

from scrapy.selector import Selector

HTML="""
<td class="name table-participant">
  <a href="/soccer/argentina/superliga/independiente-san-martin-tIuN5Umrd/">
    <span class="bold">Independiente</span>
    "- San Martin T."
  </a>
</td>

<td class="name table-participant">
  <a href="/soccer/argentina/superliga/lanus-huracan-xIDIe0Gr/">
    "Lanus - "
    <span class="bold">Huracan</span>
  </a>
</td>

<td class="name table-participant">
  <a href="/soccer/argentina/superliga/rosario-central-colon-santa-fe-Q1Ye9Jpr/">Rosario Central - Colon Santa FE</a>
</td>
"""

def strip_and_join(x):
    l=[]
    for s in x:
        # strip whitespace and quotes
        s = s.strip().strip('"').strip()
        # drop now empty strings
        if s:
            l.append(s)
    return " ".join(l)

for x in Selector(text=HTML).xpath('//td[@class="name table-participant"]/a'):
    print strip_and_join(x.xpath('.//text()').extract())

Обратите внимание, что для ясности я не сжимал код в единый список, хотя, конечно, это было бы возможно.

0 голосов
/ 07 января 2019

Вы пытаетесь искать span/text() без области. Добавьте // в начале этой части запроса, всего:

('//td[@class="name table-participant"]/a/text() | //span/text()').extract()

Но я настоятельно рекомендую использовать это решение:

 ('//td[@class="name table-participant"]//*[self::a/ancestor::td or self::span]/text()').extract

для получения диапазона только из выбранного вами td -области.

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