如何在使用 python 请求进行网络抓取时获取 data-* 属性(Python 请求造成一些问题)

How to Get data-* attributes when web scraping using python requests (Python Requests Creating Some Issues)

如何在使用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 而不是数据-*属性。

我应该如何修改才能得到完整的值?

举个更好的例子: 对于我的情况 URL 是: https://www.moneycontrol.com/india/stockpricequote/oil-drillingexploration/oilnaturalgascorporation/ONG

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

提前致谢:)

编辑

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

<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)

您遇到此问题是因为您没有检索我们在 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)

您可以从 HTML 获取数据,或者您可以抓取 API

这是一个例子:

网站是:Money Control

如果您将开发人员工具放入您的浏览器,并且 select 网络,您可以看到正在访问该网站的请求:

See image

你可以看到在headers中,出现URL来自API:priceapi.moneycontrol.com

这是一个奇怪的情况,因为 API 是打开的...通常不是。

您可以访问价格:

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

json.data.pricecurrent