Python BeautifulSoup和HTML,带有不寻常的空格

Python BeautifulSoup和HTML,带有不寻常的空格,python,beautifulsoup,Python,Beautifulsoup,我试图通过从网站上删除产品价格来更新产品价格。然而,我已经达到了一个不寻常的html格式,这给了我一些麻烦。我正在尝试返回没有空格的价格。目前,我的代码包含所有空格 <p class='product__price'> == $0 <span class='visuallyhidden'>Regular price</span> " £9.99 " == $0 </p> 但不

我试图通过从网站上删除产品价格来更新产品价格。然而,我已经达到了一个不寻常的html格式,这给了我一些麻烦。我正在尝试返回没有空格的价格。目前,我的代码包含所有空格

<p class='product__price'> == $0
    <span class='visuallyhidden'>Regular price</span>
    "


             £9.99

            " == $0
</p>
但不幸的是,使用.strip()方法不起作用,脚本返回带有大量空格和“常规价格”的价格

你知道我怎么才能拿到“9.99英镑”吗?

你应该试试这个

product_price = product_price.strip().replace("  ","")

这不起作用的原因是
p
元素包含两个子元素:

  • 一个
    span
    元素
  • 一个
    文本
    节点
当您无法在父元素
p
.text
时,您将删除“span”标记。除此之外,内容还包含引号,这将使
strip()
忽略这些引号内的空格

要解决此问题,必须首先将文本内容与
span
节点隔离,可以使用
.children
跳入
span
节点

最后,您可以告诉
.strip()
要删除哪些字符

因此,假设
p
元素内部的结构总是这样,我们可以执行以下操作:

soup = BeautifulSoup(web_page, "html.parser")

for product in soup.find_all('div', class_="product-wrapper"):
    # Get product name
    product_title = product.find('p', class_='h4 product__title').text
    # Get product price
    product_price = product.find('p', class_='product__price').text
    product_price.strip()

from bs4 import BeautifulSoup
data = """
<div>
<p class='product__price'>
    <span class='visuallyhidden'>Regular price</span>
    "


             £9.99

            "
</p>
</div>
"""

soup = BeautifulSoup(data, "html.parser")

for product in soup.find_all('div'):
    # Get product price
    product_price = product.find('p', class_='product__price')
    raw_data = list(product_price.children)[-1]

    # Remove spaces, newlines and quotes
    cleaned = raw_data.strip(' \n"')
    print(repr(cleaned))
从bs4导入美化组
data=”“”

正常价格 " £9.99 "

""" soup=BeautifulSoup(数据,“html.parser”) 对于汤中的产品。查找所有('div'): #获得产品价格 product\u price=product.find('p',class='product\u price') 原始数据=列表(产品价格子项)[-1] #删除空格、换行符和引号 已清理=原始数据条('\n') 打印(报告(已清洁))
另一种方法:regex如何

从bs4导入美化组
进口稀土
html=“”

==0美元 正常价格 " £9.99 " == $0

“”“ soup=BeautifulSoup(html,“html.parser”) 对于汤中的产品。查找所有('div'): #获得产品价格 product\u price=product.find('p',class='product\u price')。文本 #正则表达式 价格=重新搜索((£\d*\?\d*)”,产品价格) #仅当存在匹配项时打印 如果价格:打印(价格[0])
您可以使用
内容
获取最后一个元素,然后使用“拆分字符串”

从bs4导入美化组
数据=''”

==0美元 正常价格 " £9.99 " == $0

'' soup=BeautifulSoup(数据,'html.parser') 项目=汤。选择一个('.product'.price')。内容 打印(项目[-1]。拆分(“)[1]。剥离()
谢谢你的建议。这确实改善了情况。它删除了价格后的所有空格,但没有删除之前的空格。你知道如何删除价格前的空格以及“正常价格”文本吗?非常感谢!这非常有效。非常感谢你的帮助。也许你可以帮我回答关于这个问题的后续问题?我已经更新了我的问题,包括您的代码建议。谢谢!这确实有效。非常感谢您的帮助。当然!我该怎么做?谢谢您的帮助。正则表达式确实有效。感谢您的帮助。
from bs4 import BeautifulSoup
data='''<p class='product__price'> == $0
    <span class='visuallyhidden'>Regular price</span>
    "


             £9.99

            " == $0
</p>'''

soup=BeautifulSoup(data,'html.parser')
items=soup.select_one('.product__price').contents
print(items[-1].split('"')[1].strip())