Очистить текст после определенного текста и перед конкретным текстом - PullRequest
3 голосов
/ 24 октября 2019

<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': "и .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"})

Я также не знаю, как получить конкретный текст до и после текста.

Я погуглил весь этот день, но не могу найти решение. Пожалуйста, помогите.

Я обнаружил, что strings = 'stock': "and .0000" является уникальным на всей странице, только 1 'stock': и только 1 .0000 "

Так что яЯ думаю, это может быть знаком места, где я хочу почистить текст.

Пожалуйста, помогите, спасибо за вашу доброту.

Я также извиняюсь за отсутствие английского, и я на самом делене знаком с программированием. Я просто пытаюсь учиться у Google, но не могу найти ответ. Спасибо за понимание.

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

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Поскольку вы уверены, что '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])

Output:

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

71

Вы также можете сделать это без цикла и просто взять скрипт, содержащий строку stock, используя 1 строку:

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])
1 голос
/ 24 октября 2019

Я бы написал регулярное выражение, предназначенное для переменной словаря javascript, в которой хранятся интересующие вас значения. Вы можете применить это прямое значение к response.text без необходимости bs4.

enter image description here

Переменная словаря называется productObject, и вы хотитенепустой словарь, являющийся вторым вхождением productObject = {..}, т.е. не тот, в котором перед ним стоит 'var'. Вы можете использовать отрицательный внешний вид , чтобы указать это требование.

Используйте hjson для обработки имен свойств, заключенных в одинарные кавычки.


Py

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)

enter image description here


Regex: try

enter image description here

0 голосов
/ 24 октября 2019

Если вы хотите предоставить мне веб-страницу, с которой вы хотите очистить данные, я посмотрю, смогу ли я исправить код для извлечения информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...