Python 使用beautifulsoup、requests和regex的web抓取程序中出现语法错误

Python 使用beautifulsoup、requests和regex的web抓取程序中出现语法错误,python,Python,作为“自动化无聊的东西”的一部分,我正在尝试学习如何用python编写代码。其中一个练习是使用beautifulsoup和请求创建web刮板 我决定试试亚马逊的股票价格,而不是亚马逊的产品价格。我设法让它工作,但输出是几行 因此,我们希望使用regex只返回股票价格,而不返回输赢和时间戳 然而,它一直给我语法错误一行1,我尝试删除Regex部分,将其返回到bs4,并请求部分返回到开始,但这仍然给我语法错误(我使用VSC来避免括号错误) 我哪里做错了?根据错误的程度,正确的代码会是什么样子 我的代

作为“自动化无聊的东西”的一部分,我正在尝试学习如何用python编写代码。其中一个练习是使用beautifulsoup和请求创建web刮板

我决定试试亚马逊的股票价格,而不是亚马逊的产品价格。我设法让它工作,但输出是几行

因此,我们希望使用regex只返回股票价格,而不返回输赢和时间戳

然而,它一直给我语法错误一行1,我尝试删除Regex部分,将其返回到bs4,并请求部分返回到开始,但这仍然给我语法错误(我使用VSC来避免括号错误)

我哪里做错了?根据错误的程度,正确的代码会是什么样子

我的代码当前如下所示:

import bs4, requests, re

def extractedStockPrice(price):
    stockPriceRegex = re.compile(r'''
    [0-9]?
    ,?
    [0-9]+
    /.
    [0-9]*
    ''', re.VERBOSE)
    return stockPriceRegex.search(price)

def getStockPrice(stockUrl):
    res = requests.get(stockUrl)
    res.raise_for_status()

    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    elems = soup.select('#quote-header-info > div.My\(6px\).Pos\(r\).smartphone_Mt\(6px\)')
    return elems[0].text.strip()

stockPrice = extractedStockPrice(getStockPrice('https://finance.yahoo.com/quote/AMZN?p=AMZN&.tsrc=fin-srch'))
print('The price is ' + stockPrice)

问题似乎出在函数
extractedStockPrice
中的正则表达式上。它与price表达式不匹配,搜索返回“None”,这会导致注释中提到的类型错误

price
string变量到达regex部分时如下所示(示例):

'2042.76-0.24(-0.01%)收盘时间:美国东部夏令时下午4:00'

您可以使用正则表达式语法检查器来确认您的正则表达式代码:(将上面的字符串作为“测试字符串”发布,将正则表达式代码作为“正则表达式”)

看起来正斜杠应该是反斜杠。此外,一旦找到匹配项,您需要提取匹配项-您可以使用
组(0)
(请参见此并搜索re.search:)

下面的代码应该可以工作(使用Python 3.7运行):


结果:“价格为2042.76”。

问题似乎与您的正则表达式有关-在函数
extractedStockPrice
中。它与价格表达式不匹配,搜索返回“无”,这导致注释中提到的类型错误

price
string变量到达regex部分时如下所示(示例):

'2042.76-0.24(-0.01%)收盘时间:美国东部夏令时下午4:00'

您可以使用正则表达式语法检查器来确认您的正则表达式代码:(将上面的字符串作为“测试字符串”发布,将正则表达式代码作为“正则表达式”)

看起来正斜杠应该是反斜杠。此外,您需要在找到匹配项后提取匹配项-您可以使用
组(0)
(请参见此并搜索re.search:)

下面的代码应该可以工作(使用Python 3.7运行):


结果:“价格是2042.76”。

请发布完整的错误回溯。它准确地告诉我们问题出在哪里。我尝试了你的代码,没有得到语法错误(我在
print('price's'+stockPrice)
上得到了一个类型错误,因为
stockPrice
None
)。将您发布的代码与原始代码进行比较。。。有什么不同吗?为什么不直接发布错误呢?看起来你根本没有一个
SyntaxError
,你已经得到了一个答案,假设这是一个regex问题。问题是,即使答案正确,也与你的问题不匹配。请在这里帮助我们。请提供一个、完整的错误消息以及对问题的清晰描述。另一方面,变量和函数名通常应遵循带有下划线的
小写形式。另一方面,请发布完整的错误回溯。它准确地告诉我们问题出在哪里。我尝试了你的代码,没有得到语法错误(我在
print('price's'+stockPrice)
上得到了一个类型错误,因为
stockPrice
None
)。将您发布的代码与原始代码进行比较。。。有什么不同吗?为什么不直接发布错误呢?看起来你根本没有一个
SyntaxError
,你已经得到了一个答案,假设这是一个regex问题。问题是,即使答案正确,也与你的问题不匹配。请在这里帮助我们。请提供一个、完整的错误消息以及对问题的清晰描述。另一方面,变量和函数名通常应遵循带有下划线的
小写形式!VSC以某种方式使错误看起来像一个语法错误(很抱歉错误引导)。切换到空闲,现在一切运行顺利与您的修复和解释!非常感谢。VSC以某种方式使错误看起来像一个语法错误(很抱歉错误引导)。切换到空闲,现在一切运行顺利与您的修复和解释!
import bs4, requests, re

def extractedStockPrice(price):
     # fixes here:
     #   1) use backslash "\" instead of "/".
     #   2) use ".group(0)" to extract match.
     stockPriceRegex = re.compile(r'''[0-9]?,?[0-9]+\.[0-9]*''', re.VERBOSE)
     return stockPriceRegex.search(price).group(0)

def getStockPrice(stockUrl):
    res = requests.get(stockUrl)
    res.raise_for_status()

    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    elems = soup.select('#quote-header-info > div.My\(6px\).Pos\(r\).smartphone_Mt\(6px\)')
    return elems[0].text.strip()

stockPrice = extractedStockPrice(getStockPrice('https://finance.yahoo.com/quote/AMZN?p=AMZN&.tsrc=fin-srch'))

print('The price is ' + stockPrice)