BeautifulSoup解析返回空集

时间:2013-11-01 15:40:30

标签: python django parsing beautifulsoup mechanize

更新后的代码在此下方)

我有一个班级:UrlData,它会生成一个网址列表:

for url in urls:
    rawMechSiteInfo = mech.open(url)  #mechanize browse each url
    mech_response = mech.response()
    headers = mech_response.info()
    print "headers ", headers.getheader('Content-Type').encode('utf-8')
return

这一行:print "headers ", headers.getheader('Content-Type').encode('utf-8')

什么都不输出

如果我在print url_data.url_list()中执行了view,则会抛出:

<Scan.urldata.UrlData object at 0x103e73f50>

我只是想解析一个html标记的src,如:

<div class="s">
   <div>
      <div class="f kv" style="white-space:nowrap">
         <cite class="vurls">www.somewebsite.com/</cite>‎
      </div>
   </div>
</div>

以下正在解析整个文档

HarvestLinks = 'h3',attrs={'class': 'r'}

HarvestLinks = BSObjOfUrl.find('cite','vurls')

它似乎工作正常,但最后只返回一个结果,并且有多个

感谢那些到目前为止试图提供帮助的人,还有任何进一步的想法吗?

3 个答案:

答案 0 :(得分:1)

检查headers变量的输出并报告回来,似乎你仍然有错误的编码:

def url_list(self):
    #setup mechanize
    ###
    ### Mechanize settings are here.
    ###

    for url in urls:
        rawMechSiteInfo = mech.open(url)  #mechanize browse each url
        mech_response = mech.response()
        headers = mech_response.info()
        print "headers ", headers.getheader('Content-Type')
        #results = unicode(mech_response.read()) 
        #BSObjOfUrl = BeautifulSoup(results)
        #HarvestLinks = BSObjOfUrl.find_all(u'cite', class_='vurls')
    #return HarvestLinks
    return

答案 1 :(得分:0)

观察文档,attrs是一个设计不佳的论点,应该更像是一个** kwargs。

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class表示您确实要传递class_ kwarg:

>>> from bs4 import BeautifulSoup
>>> src = """ <div class="s">
...    <div>
...       <div class="f kv" style="white-space:nowrap">
...          <cite class="vurls">www.somewebsite.com/</cite>\U+200E
...       </div>
...    </div>
... </div>
...
... """
>>> soup = BeautifulSoup(src)
>>> soup.find_all('cite')
[<cite class="vurls">www.somewebsite.com/</cite>]
>>> soup.find_all('cite', attr={'class': 'vurls'})
[]
>>> soup.find_all('cite', class_='vurls')
[<cite class="vurls">www.somewebsite.com/</cite>]

答案 2 :(得分:0)

我之前从未使用过mechanize,而且我一直在使用urllib2和beautifulsoup4。 我多次遇到编码和解码问题。也许我的一些经验会有所帮助。

当您从页面elem.text读取文本时,默认值始终为unicode。有时人们有好运直接将unicode打印到屏幕上,一切都很好。有时,控制台无法正确显示unicode。这表明了两件事:

  1. 您已经准备好了数据,唯一的问题是您希望在IDE(Eclipse,Pycharm,..等)中看到它。它不起作用。您可以将unicode写入数据库或文件而无需执行任何操作,有时当您在IDE外部看到数据时,它将正确显示。

  2. 如果你想在编写代码时首先看到文本(谁没有?)你可以print elem.text.encode('utf-8')我总是好运。