我正在尝试使用谷歌翻译将印尼语翻译成英语。(因为我玩的游戏中有很多印尼人)
lang = id
inp = input("Enter to translate: \n").replace(" ","%20")
htmlfile = Request("https://translate.google.co.in/#" + lang + "/en/" + inp, headers = {'User-Agent': 'Mozilla/5.0'})
htmltext = urlopen(htmlfile).read().decode('utf-8')
regex = '<span id="result_box" class="short_text" lang="en">(.+?)</span>'
pattern = re.compile(regex)
trans = re.findall(pattern, htmltext)
print(trans)
当我提供输入时,我得到[]
。这是检查元素
<span id="result_box" class="short_text" lang="en">
<span class="hps">
greeting
</span>
我需要得到#34;问候&#34;部分
答案 0 :(得分:0)
这不是urllib
的问题,问题主要是因为你的正则表达式。默认情况下,正则表达式中的.
将匹配任何字符,但不匹配换行符或回车符。您需要启用DOTALL模式(?s)
以使.
与新行字符匹配。
regex = r'(?s)<span id="result_box" class="short_text" lang="en">(.+?)</span>'
示例:
>>> import re
>>> s = """<span id="result_box" class="short_text" lang="en">
...
... <span class="hps">
...
... greeting
...
... </span>"""
>>> re.findall(r'(?s)<span id="result_box" class="short_text" lang="en">(.+?)</span>', s)
['\n\n <span class="hps">\n\n greeting\n\n ']
>>> re.findall(r'(?s)<span id="result_box" class="short_text" lang="en">(?:(?!</).)*?(\w+)\s*</span>', s)
['greeting']
答案 1 :(得分:0)
首先,我建议您阅读the famous answer关于如何使用常规表达式解析HTML的问题。 TL; DR :不要这样做。请改用BeautifulSoup。
那就是说,我不是律师,但你想做的事可能违反了Google's Terms of Service。他们有一个paid API,每1M字符收费20美元(截至2014年10月26日),这可能更适合您的需求。使用API还有一个额外的好处,即可以保护您免受对使用的标记的更改,否则可能会破坏您的代码。
您的正则表达式与新行不匹配。编译正则表达式时需要指定DOTALL
标志。您的更新代码可能是:
lang = "id"
inp = input("Enter text to translate:\n").replace(" ","%20")
htmlfile = Request("https://translate.google.co.in/#" + lang + "/en/" + inp,
headers={'User-Agent': 'Mozilla/5.0'})
htmltext = urlopen(htmlfile).read().decode('utf-8')
pattern = re.compile(, )
trans = re.findall(
'<span id="result_box" class="short_text" lang="en">\\s+<span class="hps">(.+?)</span>',
htmltext,
re.DOTALL)
print(trans)
请注意,正则表达式会添加<span class="hps">
以从匹配的文本中排除。