Python 在使用requests.get并使用BeautifulSoup进行解析后,HTML标记中的属性值会发生更改

Python 在使用requests.get并使用BeautifulSoup进行解析后,HTML标记中的属性值会发生更改,python,web-scraping,beautifulsoup,request,Python,Web Scraping,Beautifulsoup,Request,我正在尝试清理Yahoo Finance(),但是与数据点关联的属性值正在尝试进行更改。如图所示,“span”标记具有属性数据reactid=“52”。(图中以蓝色突出显示) 获取此数据点的代码如下所示: home_page = "https://finance.yahoo.com/quote/AAPL" response = requests.get(home_page) print(response.status_code) soup = BeautifulSoup(response.con

我正在尝试清理Yahoo Finance(),但是与数据点关联的属性值正在尝试进行更改。如图所示,“span”标记具有属性数据reactid=“52”。(图中以蓝色突出显示)

获取此数据点的代码如下所示:

home_page = "https://finance.yahoo.com/quote/AAPL"
response = requests.get(home_page)
print(response.status_code)
soup = BeautifulSoup(response.content,'lxml')

header = soup.find("div", attrs = {'id':'quote-header-info'})
company_name = header.find("h1", attrs = {'data-reactid':'7'}).text
price = soup.find("span", attrs = {'span':'data-reactid':'52'})
不幸的是,它返回的值为None。(我使用了不同的解析器(html5lib),但得到了相同的响应)

在检查了soup之后,我注意到与此数据点关联的属性值已经更改。请参阅图片(很难看到,但标签在图像的上部以灰色略微突出显示)


是否存在防止值更改的方法?或者这个问题的解决方法是什么?

尝试使用xpath。您不能在BS中执行此操作,而是使用lxml

from lxml import html

home_page = "https://finance.yahoo.com/quote/AAPL"
response = requests.get(home_page)
tree = html.fromstring(response.content)
price = str(tree.xpath('//*[@id="quote-header info"]/div[3]/div[1]//span[1]//text()')[0])

硒对这也有好处。但我希望这有帮助!如果你有任何问题,请告诉我

您可以使用一个随着时间推移似乎稳定的类(至少在相当长的一段时间内)


我无法让你的代码正常工作,是吗?我能够使用Xpath(doc.Xpath(“//h1[@data reactid='7']/text()”)获取公司名称。但是,我也可以使用BeautifulSoup获得公司名称。似乎使用Xpath和lxml并不能解决我上面描述的问题。我研究了硒元素,我会尝试这个替代品。当我回应时,我能够做到,所以这很奇怪。现在它给我拉了一张空名单。另一个选项是:它将以更少的代码获取相同的数据。比如,如果你只想获取苹果的当前价格,那么它将是这样的:从yahoo_fin导入股票信息作为si si。获取实时价格(“aapl”)你能详细说明这个参数是如何工作的['.Mb(-4px)”,而不是编写整个属性值['Trsdu(0.3s)Fw(b)Fz(36px)Mb(-4px)D吗(ib)”。我一直收到以下错误:[“SelectorSyntaxError:无效字符'(“位置5”])。我假设反斜杠解决了问题?(我只是不理解逻辑)。另外,如何避免写入整个属性值?
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://finance.yahoo.com/quote/AAPL/')
soup = bs(r.content, 'lxml')
print(soup.select_one('.Mb\(-4px\)').text)