2015-05-09 2 views
1

Я выскабливание некоторые данные из Google Translate так:Возникли проблемы разделения строки

import urllib 
import mechanize 

get_url=("https://translate.google.ie/translate_a/single?client=t&sl=auto&tl=es&hl=en&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&source=btn&ssel=0&tsel=3&kc=0&tk=520887|911740&q=Hellow%20World") 

browser=mechanize.Browser() 
browser.set_handle_robots(False) 
browser.addheaders=[('User-agent','Chrome')] 

translate_text=urllib.urlopen(get_url).read() 
print translate_text 

Который дает мне следующий вывод:

[["Hellow Mundial", "Hellow World"]] 
undefined 
"en" 
undefined 
undefined 
[["Hellow", 1,…], ["World", 2,…]] 
0.022165652 
undefined 
[["en"], undefined, [0.022165652]] 

Что можно увидеть здесь:

enter image description here

Поэтому я пытаюсь разделить данные на]], поэтому мой вывод будет только:

[["Hellow Mundial", "Hellow World"]] 

Я разделив данные следующим образом:

translate_text=translate_text.split("]]") 
print translate_text[0] 

Однако, когда я запускаю это я получаю разметку страницы. Перед расколом я получил результат запроса. Как получилось, что раскол вызывает это и не разбивает строку так, как предполагалось?

ответ

3

Google возвращает что-то похожее на формат JSON (но на самом деле не JSON) для вас, которые могут быть легко разобраны после простой RegEx для замены любого последовательного запятые с одним один:

Try:

import json 
import re 

# replace any consecutive commas with a single one 
translate_text = re.sub(',+', ',', translate_text).strip() 
arr = json.loads(translate_text) 
print arr[0][0][0] # prints "Hellow Mundial" 
print arr[0][0][1] # prints "Hellow World" 

Обратите внимание, что translate_text является строкой, а arr является массивом Python. json.loads смог разобрать в свой родной формат Python, чтобы вы могли использовать простые поисковые запросы List и Dictionary.

+0

Я загляну в библиотеку JSON, приветствую. Я пытаюсь следовать этому руководству, и он, похоже, не использовал его: https://www.youtube.com/watch?v=Igvf5C7qwO0. Конкретный вопрос - 11:50. –

+0

Ой - если он действительно раскалывает его вручную, это невероятно неправильно. Весь смысл JSON заключается в том, чтобы сделать очень легко отправлять массивы и словари между машинами. –

+0

Это недействительно json возвращается –

0

Эти ]], которые вы видите, не являются частью фактической строки. они помещаются там Python, чтобы указать, что элементы внутри [] и ограничены , являются элементами массива.

В вашем случае первым элементом массива является 2D-массив, чье первое измерение содержит только один элемент. Этот элемент сам является массивом, содержащим две строки.

Если я правильно понял ваш вопрос, вам не нужно ничего разделить. Попробуйте просто ввести текст:

print translate_text[0] 

без разделения.

0

Я думаю, что строка, которую вы хотите использовать в формате JSON, то я предлагаю вам разобрать его с json Lib:

>>> import json 
>>> json.loads('[["Hellow Mundial", "Hellow World"]]') 
[[u'Hellow Mundial', u'Hellow World']] 

JSON будут переведены в объекты Python (в настоящее время здесь список из списка):

>>> l = json.loads('[["Hellow Mundial", "Hellow World"]]') 
>>> l[0] 
["Hellow Mundial", "Hellow World"] 
>>> l[0][0] 
"Hellow Mundial" 
0

Вы можете извлечь первый список с регулярным выражением:

get_url=("https://translate.google.ie/translate_a/single?client=t&sl=auto&tl=es&hl=en&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&source=btn&ssel=0&tsel=3&kc=0&tk=520887|911740&q=Hellow%20World") 

import requests 
r = requests.get(get_url) 

import re 

print(re.search("\[(\"(.*?)\")\]",r.content).group(1)) 

"Hello World como estas","Hello World how are you" 

Если йо u нужны имена в переменных:

a ,b = re.search("\[(\"(.*?)\")\]",r.text).group(1).split(",") 
print(a,b) 
"Hello World como estas" "Hello World how are you" 

Если вы действительно хотите получить список, вы можете использовать ast.literal_eval после получения первого списка с ре:

import re 
from ast import literal_eval 
print(literal_eval(re.search("\[(\"(.*?)\")\]",r.text).group(0))) 
['Hello World como estas', 'Hello World how are you'] 

Если вы запустите код в браузере он на самом деле загрузки как текстовый файл.

Смежные вопросы