拆分字符串时遇到问题

时间:2015-05-09 23:43:58

标签: python web-scraping

我正在从谷歌翻译中抓取一些数据:

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]

然而,当我运行这个时,我得到了页面标记。在拆分之前,我得到了查询结果。为什么分裂导致这种情况而不是按预期分割字符串?

4 个答案:

答案 0 :(得分:3)

Google会为您返回类似于JSON格式(但实际上不是JSON)的内容,在简单的RegEx之后可以非常轻松地将其解析为用一个逗号替换任何连续的逗号:

尝试:

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格式,以便您可以使用简单的列表和词典查找。

答案 1 :(得分:0)

您看到的那些]]不是实际字符串的一部分。它们被Python放在那里,表示[]中的内容和,分隔的内容是数组的元素。

在您的情况下,数组的第一个元素是一个2D数组,其第一个维度只包含一个元素。该元素本身就是一个包含两个字符串的数组。

如果我理解你的问题,你根本不需要拆分任何东西。尝试简单地输入:

print translate_text[0]

没有分裂。

答案 2 :(得分: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"

答案 3 :(得分: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"

如果你想要变量中的名字:

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']

如果您在浏览器中运行代码,它实际上会以.txt文件的形式下载。