【问题标题】:Grabbing a specific value from a webpage using LXML使用 LXML 从网页中获取特定值
【发布时间】:2014-08-22 21:22:44
【问题描述】:

我正在尝试使用 LXML 和 Python 从页面中获取值。

我遵循了一些有效的基本示例。但我很难从一个相当复杂的(至少对我而言)网页中获取文本。

我想从这个页面获取关注者的数量: http://twitter.com/aberdeencc

我想要追随者的确切值(在撰写本文时是 10,623 - 不是显示的 10.6K。确切的值仅显示为工具提示样式的鼠标悬停。

查看本节中的页面代码:

<a class="ProfileNav-stat ProfileNav-stat--link u-borderUserColor u-textCenter js-tooltip js-openSignupDialog js-nonNavigable u-textUserColor" data-nav="followers" 
   href="/AberdeenCC/followers" data-original-title="10,623 Followers">
       <span class="ProfileNav-label">Followers</span>
       <span class="ProfileNav-value" data-is-compact="true">10.6K</span>
</a>

我的代码是

from lxml import html

import requests

page = requests.get('http://twitter.com/aberdeencc')

tree = html.fromstring(page.text)

followers = tree.xpath('//span[@class="ProfileNav-stat ProfileNav-stat--link 

u-borderUserColor u-textCenter js-tooltip js-openSignupDialog js-nonNavigable 

u-textUserColor"]/text()')

print 'Followers: ', followers

但这会返回一个空列表。

(我知道单个值不需要列表,但我正在使用现有代码)

感谢您的指点

瓦蒂

【问题讨论】:

标签: python xpath lxml


【解决方案1】:

我会改用data-nav 属性并获取title 属性的值:

from lxml import html
import requests


page = requests.get('http://twitter.com/aberdeencc')
tree = html.fromstring(page.text)

followers = tree.xpath('//a[@data-nav="followers"]/@title')
print 'Followers: ', followers

打印:

Followers:  ['10,623 Followers']

为了从followers 中提取实际数字,您可以使用正则表达式,然后使用locale.atoi() 将字符串解析为int

import locale
import re
from lxml import html
import requests


locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

page = requests.get('http://twitter.com/aberdeencc')
tree = html.fromstring(page.text)

followers = tree.xpath('//a[@data-nav="followers"]/@title')[0]
followers = re.match(r'^([0-9,]+)\sFollowers$', followers).group(1)
followers = locale.atoi(followers)

print 'Followers:', int(followers)

打印:

Followers: 10623

此外,twitter 提供了一个API,您可以通过 python 界面使用它,有多个选项可供选择:

【讨论】:

  • 这是一个很好的答案,谢谢。非常有帮助。我确实查看了 Twitter API - 并在 Twiiter 库中使用了一些。查看文档,看起来我可以获取所有追随者的详细信息,但不是简单的倒数(无需拉下所有追随者;详细信息,翻阅它们然后计数,与快速抓取我需要的图。
  • @Watty62 是的,简单的搜索显示 API 中缺少实际的关注者数量,需要仔细查看。
【解决方案2】:
>>> from lxml import etree
>>> import requests
>>> page = requests.get("https://twitter.com/aberdeencc")
>>> doc = etree.HTML(page.text)
>>> doc.xpath('//a[@data-nav="followers"]/@title')
['10,623 Followers']

【讨论】:

    【解决方案3】:

    我建议在这种特殊情况下再次使用xpath。我认为CSS selector API 更适合这种情况。这应该有效:

    followers = tree.cssselect("a.ProfileNav-stat")[0].attrib["data-original-title"]
    # followers = '10,623 Followers'
    

    此方法需要安装cssselect

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2015-09-16
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多