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

2024-05-01 21:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图更新产品价格,从一个网站上刮他们的价格。然而,我已经达到一个不寻常的html格式,这是给我一些麻烦。我想把没有空格的价格还给你。目前,我的代码带来了所有的空间。你知道吗

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


             £9.99

            " == $0
</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()

但不幸的是,使用.strip()方法不起作用,脚本返回带有大量空格和“常规价格”的价格。你知道吗

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


Tags: 方法textgettitlehtml价格findproduct
3条回答

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

  • 一个span元素
  • text节点

当您不能.text在父元素p上时,您将删除“span”标记。除此之外,内容还包含引号,这将使strip()忽略这些引号内的空格。你知道吗

要解决此问题,必须首先将文本内容与span节点隔离,这可以通过使用.children跳入span节点来实现。你知道吗

最后,您可以告诉.strip()要删除哪些字符。你知道吗

因此,假设p元素内部的结构总是这样我们可以这样做:

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

您可以使用contents并获取最后一个元素,然后用“

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

你应该试试这个

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

相关问题 更多 >