【问题标题】:web scraping with beautifulsoup getting error用beautifulsoup进行网页抓取出错
【发布时间】:2016-09-16 23:15:35
【问题描述】:

我对 Python 很陌生,主要需要它来从网站获取信息。

def spider(max_pages):
    page = 1
    while page <= max_pages:
        url = 'https://www.example.com'
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text, "html.parser")
        for link in soup.findAll('a', {'class': 'c5'}):
            href = link.get('href')
            time.sleep(0.3)
            # print(href)
            single_item(href)
        page += 1
def single_item(item_url):
    s_code = requests.get(item_url)
    p_text = s_code.text
    soup = BeautifulSoup(p_text, "html.parser")
    upc = ('div', {'class': 'product-upc'})
    for upc in soup.findAll('span', {'class': 'upcNum'}):
        print(upc.string)
    sku = ('span', {'data-selenium': 'bhSku'})
    for sku in soup.findAll('span', {'class': 'fs16 c28'}):
        print(sku.text)
    price = ('span', {'class': 'price'})
    for price in soup.findAll('meta', {'itemprop': 'price'}):
        print(price)

    outFile = open(r'C:\Users\abc.txt', 'a')
    outFile.write(str(upc))
    outFile.write("\n")
    outFile.write(str(sku))
    outFile.write("\n")
    outFile.write(str(price))
    outFile.write('\n')
    outFile.close()

spider(1)

我想要得到的是“UPC:813066012487,价格:26.45 和 SKU:KBPTMCC2”,没有任何跨度、元或内容属性。我在下面附上了我的输出 这是我的输出: screenshot

我哪里做错了? 希望有人能弄清楚!谢谢!!

【问题讨论】:

  • 但是你期望什么输出?另外,您能否修复代码的缩进以使结构更清晰?我猜def single_item 下面的整个块应该缩进?
  • 先抓取所有链接,然后去每个链接并抓取(upc、price、sku)。
  • 预期输出是什么
  • 预期输出是这样的 813066012487 KBPTMCC2 26.45
  • 添加您想要解决的问题。

标签: python web-scraping beautifulsoup


【解决方案1】:

你想要的数据在div属性data-itemdata中,你可以调用json.loads,它会给你一个dict,你可以访问得到你想要的:

from bs4 import BeautifulSoup
import requests
import json

soup = BeautifulSoup(requests.get("https://www.bhphotovideo.com/c/buy/accessories/ipp/100/mnp/25/Ns/p_PRICE_2%7c0/ci/20861/pn/1/N/4005352853+35").content, "html.parser")


for d in soup.select("div[data-selenium=itemDetail]"):
    data = json.loads(d["data-itemdata"])
    print(data)

每个数据字典看起来像:

{u'catagoryId': u'20861',
 u'inCart': False,
 u'inWish': False,
 u'is': u'REG',
 u'itemCode': u'KBPTMCC2',
 u'li': [],
 u'price': u'26.45',
 u'searchTerm': u'',
 u'sku': u'890522'}

所以只需通过密钥访问,即price = data["price"]

要获取UPC,我们只需要访问商品页面,我们可以通过data-selenium属性从h3获取url :

for d in soup.select("div[data-selenium=itemDetail]"):
    url = d.select_one("h3[data-selenium] a")["href"]
    upc = BeautifulSoup(requests.get(url).content, "html.parser").select_one("span.upcNum").text.strip()
    data = json.loads(d["data-itemdata"])

并非所有页面都有 UPC 值,因此如果您只想要带有 UPC 的产品,则必须先检查选择是否找到任何内容:

for d in soup.select("div[data-selenium=itemDetail]"):
    url = d.select_one("h3[data-selenium] a")["href"]

    upc = BeautifulSoup(requests.get(url).content, "html.parser").select_one("span.upcNum")
    if upc:
        data = json.loads(d["data-itemdata"])
        text = (upc.text.strip()

【讨论】:

  • 感谢 Padraic,我得到了一切,但缺少一件事。每个项目都有UPC,为了得到那个需要得到每个链接并得到那个。我想不通。
  • 现在我得到这个 AttributeError: 'NoneType' object has no attribute 'text'
  • 谢谢,完美。
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 2020-10-04
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多