Python - Как распечатать одну строку из текста - PullRequest
0 голосов
/ 18 декабря 2018

Итак, я работал с abit из bs4 и смог распечатать текст.Прямо сейчас мне удалось распечатать var ajaxsearch, который init приходит намного больше.

Я написал код, в котором он распечатывает все, что содержит javascript, и распечатывает, где var ajaxsearch начинается с этого:

  try:
        product_li_tags = bs4.find_all('script', {'type': 'text/javascript'})
    except Exception:
        product_li_tags = []

    special_code = ''
    for s in product_li_tags:
        if s.text.strip().startswith('var ajaxsearch'):
            special_code = s.text
            break

    print(special_code)

и я получаю вывод:

var ajaxsearch = false;
var combinationsFromController ={
  "224114": {
    "attributes_values": {
      "4": "5.5"
    },
    "attributes": [
      22
    ],

    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'22'"
  },
  "224140": {
    "attributes_values": {
      "4": "6"
    },
    "attributes": [
      23
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'23'"
  },
  "224160": {
    "attributes_values": {
      "4": "6.5"
    },
    "attributes": [
      24
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'24'"
  },
  "224139": {
    "attributes_values": {
      "4": "7"
    },
    "attributes": [
      25
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'25'"
  },
  "224138": {
    "attributes_values": {
      "4": "7.5"
    },
    "attributes": [
      26
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'26'"
  },
  "224113": {
    "attributes_values": {
      "4": "8"
    },
    "attributes": [
      27
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'27'"
  },
  "224129": {
    "attributes_values": {
      "4": "8.5"
    },
    "attributes": [
      28
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'28'"
  },
  "224161": {
    "attributes_values": {
      "4": "9"
    },
    "attributes": [
      29
    ],
    "unit_impact": 0,
    "minimal_quantity": "1",
    "date_formatted": "",
    "available_date": "",
    "id_image": -1,
    "list": "'29'"
  }
};
var contentOnly = false;
var Blank = 1;
var Format = 2;

Это означает, что когда я распечатываю s.text.Я получу вывод кода выше.Небольшое редактирование: если я попытаюсь сделать if s.text.strip().startswith('var combinationsFromController'):, оно не найдет значение, а также, если я изменю его наоборот if 'var combinationsFromController' in s.text.strip():, оно выведет тот же вывод, что и выше.

Однако моя проблемав том, что я просто хочу иметь возможность распечатать var combinationsFromController и пропустить остальные, где я позже смогу преобразовать значения в json с помощью json.loads, но до этого у меня возникла проблема: как я могу печатать, чтобы мне удалось простоимеют значение var combinationsFromController?

РЕДАКТИРОВАТЬ: вероятно, решил это!

for s in product_li_tags:
            if 'var combinationsFromController' in s.text.strip():
                for line in s.text.splitlines():
                    if line.startswith('var combinationsFromController'):
                        get_full_text = line.strip()
                        get_config = get_full_text.split(" = ")
                        cut_text = get_config[1][:-1]
                        get_json_values = json.loads(cut_text)

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

с использованием re с выражением (\{.*?\}); для захвата данных между var combinationsFromController = и ;var contentOnly = false;

import re

....
print(special_code)
jsonStr = re.search(r'(\{.*?\});', special_code, re.S).group(1)
combinationsFromController = json.loads(jsonStr)

for key in combinationsFromController:
    print(key)
    # 224114
    # 224140
    # 224160
0 голосов
/ 18 декабря 2018

Если я правильно понимаю ваш вопрос, у вас есть строка из 121 строки, представляющая 5 переменных javascript, и вы хотите получить подстроку, содержащую только 2-ю переменную .

Вы можете использовать строку Pythonманипулирование следующим образом:

start = special_code.split('\n').index('var combinationsFromController ={')
end   = special_code.split('\n')[start + 1:].index('var contentOnly = false;')
print('\n'.join(lines[start:end + 3]))

Использование метода str.index, чтобы найти вхождения необходимой вам переменной javascript. Если переменные порядка являются произвольными , т.е. вы не знаете, как называется следующая переменная после целевой, вы все равно можете использовать аналогичные операции со строками для получения требуемой подстроки.

lines = special_code.split('\n')
start = lines.index('var combinationsFromController ={')
end   = lines[-1]
for i, line in enumerate(lines[start + 1:]):
    if 'var' in line:
        end = start + i
        break
print('\n'.join(lines[start:end + 1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...