【问题标题】:How to Get data-* attributes when web scraping using python requests (Python Requests Creating Some Issues)How to Get data-* attributes when web scraping using python requests (Python Requests Creating Some Issues)
【发布时间】:2021-04-26 19:54:45
【问题描述】:

使用python的requests库如何获取data-d1-value的值?

request.get(URL) 函数本身并没有给出原始网页中存在的 div 中的 data-* 属性。

网页如下:

<div id="test1" class="class1" data-d1-value="150">
180
</div>

我使用的代码是:

req = request.get(url)
soup = BeautifulSoup(req.text, 'lxml')
d1_value = soup.find('div', {'class':"class1"})
print(d1_value)

我得到的结果是:

<div id="test1" class="class1">
180
</div>

当我调试这个时,我发现 request.get(URL) 没有返回完整的 div 而是只返回 id 和 class 而不是 data-* 属性。

我应该如何修改以获得完整的价值?

更好的例子: 就我而言,网址是: https://www.moneycontrol.com/india/stockpricequote/oil-drillingexploration/oilnaturalgascorporation/ONG

以及变量的信息: DIV CLASS 是:class="inprice1 nsecp" 和 data-numberanimate-value 的值是我要获取的值

提前致谢:)

【问题讨论】:

  • 感谢您添加信息,但是请求的 url 或响应是什么?以防万一请阅读:How to create a Minimal, Reproducible Example 谢谢
  • 因此,如果响应中没有数据属性,则可能是网站提供动态内容,请求无法获取。要检查这一点,请提供您请求的网址。
  • 谢谢,我会阅读您刚刚分享的链接:对于我来说,链接是:moneycontrol.com/india/stockpricequote/oil-drillingexploration/… 我想要获得的值是:DIV CLASS 是:class="inprice1 nsecp"和 data-numberanimate-value 的值是我要获取的值
  • 感谢您将外观改进得更好更详细,看看我的编辑,基于此新信息。

标签: python web-scraping python-requests html-parsing hidden


【解决方案1】:

编辑

网站响应在请求的情况下会有所不同 - 在您使用请求的情况下,您正在寻找的值是以这种方式提供的:

<div class="inprice1 nsecp" id="nsecp" rel="92.75">92.75</div>

所以您可以从reltext 获得它:

soup.find('div', {'class':"inprice1"})['rel']
soup.find('div', {'class':"inprice1"}).get_text()

示例

import requests
from bs4 import BeautifulSoup

req = requests.get('https://www.moneycontrol.com/india/stockpricequote/oil-drillingexploration/oilnaturalgascorporation/ONG')

soup = BeautifulSoup(req.text, 'lxml')

print('rel: '+soup.find('div', {'class':"inprice1"})['rel'])
print('text :'+soup.find('div', {'class':"inprice1"}).get_text())

输出

rel: 92.75
text: 92.75

要在您检查时获得显示源的响应,您必须尝试 selenium

示例

from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep

driver = webdriver.Chrome(executable_path='C:\Program Files\ChromeDriver\chromedriver.exe')
url = "https://www.moneycontrol.com/india/stockpricequote/oil-drillingexploration/oilnaturalgascorporation/ONG"

driver.get(url)
sleep(2)

soup = BeautifulSoup(driver.page_source, "lxml")
print(soup.find('div', class_='inprice1 nsecp')['data-numberanimate-value'])
driver.close()

要获取属性值,只需将['data-d1-value'] 添加到您的find()

示例

from bs4 import BeautifulSoup

html='''
<div id="test1" class="class1" data-d1-value="150">
180
</div>
'''

soup = BeautifulSoup(html, 'lxml')
d1_value = soup.find('div', {'class':"class1"})['data-d1-value']
print(d1_value)

【讨论】:

  • 是的,你是对的,但是 request.get(URL) 函数本身并没有给出数据属性,它只是返回:
    180
  • @Xavier:那您应该改进您的问题并添加此信息,以便每个人都知道并可以提供帮助。谢谢
  • 我已经做到了,希望能消除一些疑虑。
  • 看看我的编辑,希望这将有助于理解和决定你要走的路。
【解决方案2】:

您看到了这个问题,因为您没有检索到我们在 DIV 上定义的所有其他属性。

下面的代码将检索我们在 div 上定义的所有自定义属性

from bs4 import BeautifulSoup
s = '<div id="test1" class="class1" data-d1-value="150">180</div>'
soup = BeautifulSoup(s)

attributes_dictionary = soup.find('div',{'class':"class1"}).attrs
print(attributes_dictionary)

【讨论】:

  • 是的,你是对的,但是 request.get(URL) 函数本身并没有给出数据属性,它只是返回:
    180
【解决方案3】:

您可以从 HTML 中获取数据,也可以通过抓取 API 来实现

这是一个例子:

网址是:Money Control

如果您将开发者工具放入浏览器,然后选择网络,您可以看到正在执行该网站的请求:

See image

您可以看到,在标头中,出现了来自 API 的 URL:priceapi.moneycontrol.com

这是一个奇怪的案例,因为 API 是开放的……但通常不是。

您可以访问价格:

假设您将 JSON 数据保存到一个名为“json”的变量中,您可以通过以下方式访问它:

json.data.pricecurrent

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2022-12-02
    • 2022-12-27
    • 2022-12-27
    • 2021-12-27
    • 2022-12-19
    • 2023-03-20
    • 2013-07-14
    • 2022-12-27
    相关资源
    最近更新 更多