python 3无法刮擦

时间:2014-10-26 16:53:52

标签: python

我正在尝试使用谷歌翻译将印尼语翻译成英语。(因为我玩的游戏中有很多印尼人)

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;部分

2 个答案:

答案 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">以从匹配的文本中排除。