【问题标题】:why do i get empty lists returned from web scraping?为什么我会从网络抓取返回空列表?
【发布时间】:2019-07-10 15:32:26
【问题描述】:

我正在尝试从网站获取天气并收集这些数据。但有些请求会返回空列表或预期的不同信息。为什么会发生这种情况以及从网站获取正确 xpath 和信息的正确格式和方法是什么。

我曾尝试使用多个网站,但无法始终如一地获得结果。

import requests
from lxml import html

site1data = requests.get('http://m.bom.gov.au/vic/melbourne/', verify = 
False)
tree = html.fromstring(site1data.content)

humidity = tree.xpath('//div[@class="humidity"]/text()')

print(humidity)

预期的结果是这样的: 67% 但我得到了: ['\n\t\t\t\t\t', '\n\t\t\t\t\t', '\n\t\t\t\t\t', '\n\ t\t\t\t']

【问题讨论】:

  • 里面有内部标签//div[@class="humidity"]/p/text()。要获取所有文本节点,请使用://div[@class="humidity"]/*/text()

标签: python xpath web-scraping lxml


【解决方案1】:

因为您要查找的文本数据显示在 <p> 标记内,而不是 <div> 本身内:

<div class="humidity">
    <h3>Humidity</h3>
    <img class="humidity" src="/assets/images/ui/humidity.svg" />
    <p>65%</p>
</div>

这个 xpath 应该可以解决你的直接问题:

humidity = tree.xpath('//div[@class="humidity"]/p/text()')

【讨论】:

  • 这是否意味着我必须在路径末尾包含标签才能被带到网站中更具体的点?
  • @BOBTHEBUILDER 一般来说,是的。您使用 XPath 导航文档的“骨架”——DOM。它是允许精确刮削的工具之一。 W3C 有一个用于 xpath 的tutorial。但也请看看 QHarr 的回答。 API 现在很常见,熟悉它们的用法很有用。
【解决方案2】:

如果您查看该站点,他们提供了一个由 API 提供的 beta 站点,因此您可以从该端点以 json 格式获取所有信息

import requests

r = requests.get('https://api.weather.bom.gov.au/v1/locations/r1r0fs/observations').json()
print(r)

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多