Использование Python & l xml для очистки сети Strava - PullRequest
1 голос
/ 23 апреля 2020

Я хочу получить клубную деятельность от Стравы. Первоначально я смотрел на использование API & C# (потому что это то, что я знаю), но из-за недостатков в информации, предоставленной API, я обратился к технике здесь (https://twitter.com/OleksMaistrenko/status/1252251408495190018 ). Это был фантастический ресурс c, и он помог мне пройти 90% пути. Сейчас я пытаюсь получить больше информации из HTML и, будучи полным Python / l xml newb ie, я не могу понять, как это сделать.

Итак, чтобы получить темп активности, этот HTML:

   <li title="Pace">
      "7:46"
      <abbr class="unit" title="minutes per mile"> /mi</abbr>
   </li>

очищается следующим кодом:

activity_pace = activity.xpath(".//li[@title='Pace']")[0].text.strip()

Q1. Итак, как мне почистить это HTML, чтобы получить продолжительность активности?

<li title="Time">
   "56"
   <abbr class="unit" title="minute">m</abbr>
    " 26"
   <abbr class="unit" title="second">s</abbr>
</li>

Я пробовал это, и он выбирает только минуты:

activity_time = activity.xpath(".//li[@title='Time']")[0].text

Q2 , Я хотел бы получить название деятельности (в данном случае, «Утренний пробег»). Вот HTML:

<h3 class="entry-title activity-title" str-on="click" str-trackable- 
  id="ChQIBTIQCIGRyLgMGAEwLDgAQABIARIECgIIBA==" str-type="self">
  <div class="entry-type-icon"><span class="app-icon-wrapper  "><span class="app-icon icon-run icon-dark 
  icon-lg"></span></span></div>
  <strong>
  <a href="/activities/3339847809">Morning Run</a>
  </strong>
</h3>

Я понял, что блок может быть получен с помощью этого:

activity.xpath(".//h3[@class='entry-title activity-title']")[0]

, но после этого я ' м в тупик: - (

1 Ответ

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

Это не очень элегантно, но можно сделать так: допустим, что ваш html выглядит так:

activity = """
<doc>
  <h3 class="entry-title activity-title" str-on="click" str-trackable- 
  id="ChQIBTIQCIGRyLgMGAEwLDgAQABIARIECgIIBA==" str-type="self">
  <div class="entry-type-icon"><span class="app-icon-wrapper  "><span class="app-icon icon-run icon-dark 
  icon-lg"></span></span></div>
  <strong>
  <a href="/activities/3339847809">Morning Run</a>
  </strong>
</h3>
<li title="Time">
   "56"
   <abbr class="unit" title="minute">m</abbr>
    " 26"
   <abbr class="unit" title="second">s</abbr>
</li>
</doc>"""

import lxml.html
doc = lxml.html.fromstring(activity)

sports = doc.xpath("//h3[@class='entry-title activity-title']//a/text()")
duration = doc.xpath('//li[@title="Time"]')
abbrs = doc.xpath('//abbr[@class="unit"]')

for abbr in abbrs:
    abbr.text=''
for sport in sports:
    print(sport)
for d in dur:
    print(d.text_content().strip().replace('\n','').replace(' ','').replace('""',':'))

Вывод:

Morning Run
"56:26"
...