从解析页面中筛选出美丽的汤4发现

时间:2017-03-29 14:19:37

标签: python beautifulsoup bs4

晚上,

在试图解决这个问题时,我走到了尽头。

简而言之,我正在使用BS4的findAll()函数解析带有标签的产品页面。我得到了正确的响应,但我搜索的区域是“纯文本”,没有标签,我可以使用BS4过滤到目前为止理解

def find_product(counter):
url = base_url
print('Looking in ' + url)
while not matches[counter]:
    print(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'))
    try:
        response1 = search_session.get(url)
    except:
        print('Unable to connect to site...')
        if counter == checkout_qty - 1:
            sys.exit()
        else:
            continue

    soup1 = bs(response1.text, 'html.parser')
    #soup1.find_all('script')
    soup2 = soup1.findAll('script', text = re.compile('id                : ')) #using text recompiling doesn't really do anything,just gives a slightly cleaner output of findings.
    print(soup2)
    for ids in soup2:
        link = ids.find(text = re.compile('id'))
        #i think i should use it somehow here,but I lack knowledge
        #this loop is unfinished


    break

这是我从产品页面解析的内容。

<main class="B__container">
      <script>

  product.p = {
    id             : 47755536459,
    title          : "PRODUCT NAME",
    handle         : "PRODUCT HANDLE",
    vendor         : "",
    available      : ,
    images         : ["image-link.com\/files\/1111"],
    featured_image : "image-link.com\/files\/1111",
    options        : ["Size"],
    tags           : [],
    price          : 24000,
    variants       : []
  };

    product.p.variants.push({
      id                : 40113207495,
      parent_id         : 10025946759,
      available         : false,
      featured_image    : null,
      public_title      : null,
      requires_shipping : true,
      price             : 24000,
      options           : ["4"],
      option1           : "4",
      option2           : "",
      option3           : "",
      option4           : ""
    });

    product.p.variants.push({
      id                : 40113207559,
      parent_id         : 10025946759,
      available         : false,
      featured_image    : null,
      public_title      : null,
      requires_shipping : true,
      price             : 24000,
      options           : ["4.5"],
      option1           : "4.5",
      option2           : "",
      option3           : "",
      option4           : ""
    });

    product.p.variants.push({
      id                : 40113207623,
      parent_id         : 10025946759,
      available         : false,
      featured_image    : null,
      public_title      : null,
      requires_shipping : true,
      price             : 24000,
      options           : ["5"],
      option1           : "5",
      option2           : "",
      option3           : "",
      option4           : ""
    });
  </script>

我的目标是使用数字提取id,然后将其发送到单独的函数。

问题,缺乏知识或缺乏如何使用BS4充分发挥我想要的技能。

1 个答案:

答案 0 :(得分:0)

试试这段代码......这只是字符串操作来获取必要的信息..在这种情况下,id值。

  1. \n
  2. 拆分数据
  3. for此列表中的每个元素,检查子串id是否存在
  4. 如果True,请在经过一些操作后打印该行(stripsplitreplace
  5. <强>代码:

    s = soup2.text
    data = s.split('\n')
    
    for i, d in enumerate(data):
        if " id " in d:
            print(data[i].strip().split(':')[1].replace(',', ''))
    

    <强>输出:

    47755536459
    40113207495
    40113207559
    40113207623
    

    已编辑的代码:

    for ids in soup2:
        s = ids.text
        data = s.split('\n')
    
        for i, d in enumerate(data):
            if " id " in d:
                print(data[i].strip().split(':')[1].replace(',', ''))
    

    您可以print代替append代替list,而不是if myObject is MyClass { // myObject is of type MyClass } ,而是稍后再使用它们。