使用Python & lxml进行网络搜刮Strava。

问题描述 投票:1回答:1

我想从Strava获取俱乐部活动。我原本想使用 api & C# (因为那是我所知道的),但由于 api 所提供的信息存在缺陷,我转而使用这里的技术 (https:/twitter.comOleksMaistrenkostatus1252251408495190018。). 这是一个非常棒的资源,让我走了90%的路。我现在试图从HTML中获取更多的信息&作为一个完全的Pythonlxml新手,我不知道该怎么做。

所以,为了获得活动步伐,这个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]

但在这之后,我就陷入了困境 :-(

python web-scraping lxml
1个回答
1
投票

虽然不是很优雅,但是可以这样做。假设你的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"
© www.soinside.com 2019 - 2024. All rights reserved.