我写了一个非常简单的代码来获得urbandicationary.com上任何术语的第一个结果。我首先写了一件简单的事情来查看他们的代码是如何格式化的。
def parseudtest(searchurl):
url = 'http://www.urbandictionary.com/define.php?term=%s' %searchurl
url_info = urllib.urlopen(url)
for lines in url_info:
print lines
为了进行测试,我搜索了"cats",并将其用作变量searchurl
。我收到的输出当然是一个巨大的页面,但这里是我关心的部分:
<meta content='He set us up the bomb. Also took all our base.' name='Description' />
<meta content='He set us up the bomb. Also took all our base.' property='og:description' />
<meta content='cats' property='og:title' />
<meta content="http://static3.urbandictionary.com/rel-1e0b481/images/og_image.png" property="og:image" />
<meta content='Urban Dictionary' property='og:site_name' />
正如你所看到的,当"元内容"元素第一次出现在网站上时,它是搜索词的第一个定义。所以我写了这个代码来检索它:
def parseud(searchurl):
url = 'http://www.urbandictionary.com/define.php?term=%s' %searchurl
url_info = urllib.urlopen(url)
if (url_info):
xmldoc = minidom.parse(url_info)
if (xmldoc):
definition = xmldoc.getElementsByTagName('meta content')[0].firstChild.data
print definition
由于某种原因,解析似乎不起作用,每次都会遇到错误。这尤其令人困惑,因为该网站似乎使用了与我成功检索到特定数据的其他网站基本相同的格式。如果有人能帮我弄清楚我在这里搞砸了什么,我将不胜感激。
由于您没有对发生的错误进行追溯,因此很难具体说明,但我认为尽管该网站声称是XHTML,但它实际上并不是有效的XML。您最好使用Beautiful Soup,因为它是为解析HTML而设计的,可以正确处理损坏的标记。
我从未使用过minidom解析器,但我认为问题在于您调用:
xmldoc.getElementsByTagName('meta content')
虽然标签名称是meta
,但content
只是第一个属性(通过突出显示html代码可以很好地显示)。
尝试将该位替换为:
xmldoc.getElementsByTagName('meta')