【问题标题】:Scrape Text After Specific Text and Before Specific Text在特定文本之后和特定文本之前刮掉文本
【发布时间】:2019-10-24 11:29:04
【问题描述】:

<script type="text/javascript">


                        'sku': 'T3246B5',
                        'Name': 'TAS BLACKY',
                        'Price': '111930',
                        'categories': 'Tas,Wanita,Sling Bags,Di bawah Rp 200.000',
                        'brand': '',
                        'visibility': '4',
                        'instock': "1",
                        'stock': "73.0000"

            </script>

我想刮掉 : 'stock': " and .0000" 之间的文本,所以理想的结果是 73

我以前知道的是做这样的事情:

for url2 in urls2:
        req2 = Request(url2, headers={'User-Agent': 'Chrome/39.0.2171.95'})
        html2 = uReq(req2).read()
        page_soup2 = soup(html2, "html.parser")


        # Grab text
        stock = page_soup2.findAll("p", {"class": "stock"})
        stocks = stock[0].text

我在以前的代码中使用了类似的东西,它在网络更改代码之前就可以工作。

但现在我要抓取的整个页面中有超过 1 个 ("script", {"type": "text/javascript"})。所以我不知道如何找到正确的(“script”,{“type”:“text/javascript”})

我也不知道hot获取具体的文字前后的文字。

我已经用谷歌搜索了一整天,但找不到解决方案。请帮忙。

发现strings = 'stock': "and .0000"在整个页面中是唯一的,只有1个'stock': and only 1 .0000"

所以我认为这可能是我要抓取文本的位置的标志。

请帮忙,谢谢你的好意。

我也为我缺乏英语而道歉,而且我实际上不熟悉编程。我只是想向谷歌学习,但我找不到答案。感谢您的理解。

url = view-source:sophieparis.com/blacky-bag.html

【问题讨论】:

标签: python python-3.x web-scraping beautifulsoup


【解决方案1】:

既然您确定'stock' 只显示在您想要的脚本标签中,您可以提取包含'stock 的文本。一旦你有了它,就需要修剪掉多余的部分,并将其更改为双引号以将其转换为有效的 json 格式,然后使用json.loads()

简单地读取它
import requests
from bs4 import BeautifulSoup
import json


url2 = 'https://www.sophieparis.com/blacky-bag.html'

req2 = requests.get(url2, headers={'User-Agent': 'Chrome/39.0.2171.95'})

page_soup2 = BeautifulSoup(req2.text, "html.parser")


scripts = page_soup2.find_all('script')

for script in scripts:
    if 'stock' in script.text:
        jsonStr = script.text
        jsonStr = jsonStr.split('productObject = ')[-1].strip()
        jsonStr = jsonStr.rsplit('}',1)[0].strip() + '}'

        jsonData = json.loads(jsonStr.replace("'",'"'))

print (jsonData['stock'].split('.')[0])

输出:

print (jsonData['stock'].split('.')[0])

71

您也可以在没有循环的情况下执行此操作,只需使用 1 行获取其中包含字符串 stock 的脚本:

jsonStr = page_soup2.find('script', text=re.compile(r'stock')).text

完整代码如下所示:

import requests
from bs4 import BeautifulSoup
import json
import re


url2 = 'https://www.sophieparis.com/blacky-bag.html'

req2 = requests.get(url2, headers={'User-Agent': 'Chrome/39.0.2171.95'})

page_soup2 = BeautifulSoup(req2.text, "html.parser")

jsonStr = page_soup2.find('script', text=re.compile(r'stock')).text
jsonStr = jsonStr.split('productObject = ')[-1].strip()
jsonStr = jsonStr.rsplit('}',1)[0].strip() + '}'

jsonData = json.loads(jsonStr.replace("'",'"'))

print (jsonData['stock'].split('.')[0])

【讨论】:

  • 感谢您的帮助!我已经尝试了这两个代码并且它有效!非常感谢你!真的是帮到我了!谢谢你的好意。我还有一个问题,我尝试将“库存”更改为“类别”、“品牌”、“可见性”、“库存”,代码仍然运行良好。但是当我将其更改为“sku”、“名称”和“价格”时,它就不再起作用了。是不是因为那些“sku”、“Name”和“Price”也在另一个脚本中找到? (这不是唯一的)。如果我还想抓取“sku”、“名称”和“价格”,代码应该是什么?
  • 我又试了一次,只是将 = print (jsonData['stock'].split('.')[0]) 改为 print (jsonData['sku'].split('. ')[0]) 并且效果很好!非常感谢您的帮助^o^
【解决方案2】:

我会编写一个正则表达式,它以包含感兴趣值的 javascript 字典变量为目标。您可以直接将此应用到response.text,而无需bs4

字典变量称为productObject,并且您需要非空字典,它是productObject = {..} 第二次出现的位置,即不是前面有“var”的字典。您可以使用negative lookbehind 来指定此要求。

使用hjson 处理用单引号括起来的属性名称。


import requests, re, hjson

r = requests.get('https://www.sophieparis.com/blacky-bag.html')
p = re.compile(r'(?<!var\s)productObject = ([\s\S]*?})')
data = hjson.loads(p.findall(r.text)[0])
print(data)


正则表达式: try

【讨论】:

    【解决方案3】:

    如果您想向我提供您希望从中抓取数据的网页,我会看看是否可以修复代码以提取信息。

    【讨论】:

    • view-source:sophieparis.com/blacky-bag.html
    • 查看 Chitown88 的答案,我刚刚检查了网页,它是唯一包含“股票”的脚本标签,因此该代码适用于您。
    • 我查看了 Chitown88 的答案,效果很好!也非常感谢您的帮助。我还有一个问题,我尝试将“库存”更改为“类别”、“品牌”、“可见性”、“库存”,代码仍然运行良好。但是当我将其更改为“sku”、“名称”和“价格”时,它就不再起作用了。是不是因为那些“sku”、“Name”和“Price”也在另一个脚本中找到? (这不是唯一的)。如果我还想抓取“sku”、“名称”和“价格”,代码应该是什么?
    • 我又试了一次,只是将 = print (jsonData['stock'].split('.')[0]) 改为 print (jsonData['sku'].split('. ')[0]) 并且效果很好!非常感谢您的帮助^o^
    • @Mina Mino,如果它对您有用,请务必接受该解决方案
    猜你喜欢
    • 2016-08-24
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多