【问题标题】:Inconsistent parsing using find method in Beautiful Soup在 Beautiful Soup 中使用 find 方法解析不一致
【发布时间】:2021-08-05 05:57:09
【问题描述】:

我正在尝试使用 find() 方法解析网站,但它没有找到我尝试解析的所有元素。三个元素中的两个被提取得很好。但我没有成功 解析“商店位置”。 HTML的相关sn-p是

<span class="fs-selected-store__name u-bold" data-store-id="65defcf2-bc15-490e-a84f-1f13b769cd22">PAK'nSAVE Albany</span>

这是我的代码

import requests
from bs4 import BeautifulSoup as bs
import re

dollars_pattern = '>([0-9][0-9]?)'
cents_pattern = '>([0-9][0-9])'

r = requests.get('https://www.paknsaveonline.co.nz/product/5026677_ea_000pns?name=organic-black-beans')

soup = bs(r.content,'html.parser')
#soup = bs(r.content,'lxml')

cents =  str(soup.find('span', {'class': "fs-price-lockup__cents"}))
dollars = str(soup.find('span', {'class': "fs-price-lockup__dollars"}))
Store =  str(soup.find('span', {'class': "fs-selected-store__name u-bold"}))

centsprice =re.findall(cents_pattern, cents)
dollarsprice = re.findall(dollars_pattern, dollars)

print(dollarsprice, centsprice, store)

Output: ['1'] ['89'] None

我得到了美元价格和美分价格的预期输出,但没有得到商店的结果。 没有错误 - 表明这是一个匹配问题。 这是Google Colab.中的代码

我测试了一个不同的解析器,但这没有帮助(请参阅代码中的注释)。

谁能指出问题所在?

【问题讨论】:

    标签: python parsing beautifulsoup python-requests


    【解决方案1】:

    如果你打印soup,你可以手动查找数据,它可以在脚本标签中找到,所以我已经提取了脚本标签的内容

    data=soup.find_all("script",attrs={"data-cfasync":"false"})[3].contents[0]
    

    现在,如果您看到我们必须在 () 之间提取数据,以便可以使用 re 模块

    import re
    res=re.findall(r'\(.*?\)', data)
    final=res[0].strip("()")
    

    清理数据后,我们可以使用json加载数据并使用key查找特定值

    import json
    store_data=json.loads(final)
    print(store_data['storeName'])
    

    输出:

    PAK'nSAVE Kaitaia
    

    【讨论】:

      【解决方案2】:

      在制作页面汤之前,您可以使用 selenium 和 Web 驱动程序。

      首先从以下链接下载一个webdriver,例如Chrome webdriver:https://chromedriver.chromium.org/downloads,请确保下载的版本与您电脑上安装的chrome版本一致。

      接下来,将webdriver文件放到code/.py/.ipynb文件所在的目录下。

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      from bs4 import BeautifulSoup
      from time import sleep
      
      options= Options()
      options.headless = True
      driver = webdriver.Chrome(options = options)
      url= "https://www.kanshudo.com/collections/wikipedia_jlpt/WPJLPT-N3-1"
      
      driver.get(url)
      sleep(1)
      
      soup = BeautifulSoup(driver.page_source, 'html.parser')
      

      根据你的环境下载上面提到的库,然后从汤里找到你想要的标签。

      【讨论】:

        【解决方案3】:

        如果您正在使用 google colab,您可以使用此代码:

        !pip install selenium
        !apt-get update # to update ubuntu to correctly run apt install
        !apt install chromium-chromedriver
        !cp /usr/lib/chromium-browser/chromedriver /usr/bin
        import sys
        from bs4 import BeautifulSoup as bs
        import re
        
        dollars_pattern = '>([0-9][0-9]?)'
        cents_pattern = '>([0-9][0-9])'
        
        sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')
        from selenium import webdriver
        
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        wd = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
        wd.get("https://www.paknsaveonline.co.nz/product/5026677_ea_000pns?name=organic-black-beans")
        sleep(1)
        
        soup = bs(wd.page_source, 'html.parser')
        
        cents =  str(soup.find('span', {'class': "fs-price-lockup__cents"}))
        dollars = str(soup.find('span', {'class': "fs-price-lockup__dollars"}))
        Store =  str(soup.find('span', {'class': "fs-selected-store__name u-bold"}))
        
        centsprice =re.findall(cents_pattern, cents)
        dollarsprice = re.findall(dollars_pattern, dollars)
        
        print(dollarsprice, centsprice, Store)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-21
          • 2023-03-24
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多