解析时获取空列表

时间:2016-05-29 12:37:16

标签: python beautifulsoup

我正在解析jeevansathi.com并希望选择<ul>,其ID为#profileInfo2但是在使用BeautifulSoup后我得到空列表下面是代码和输出

import requests, bs4
res = requests.get('http://www.jeevansathi.com/search/quick/169903999/1')
try:    
  res.raise_for_status()
  nazia=bs4.BeautifulSoup(res.text)
  print type(nazia)
  elems=nazia.select("#profileInfo2")
  print type(elems)
  print len(elems)
except Exception as exc:
  print("There was a problem: %s" % (exc))

输出

<class 'bs4.BeautifulSoup'>
<type 'list'>
0

2 个答案:

答案 0 :(得分:3)

内容是动态加载的,您可以在请求返回的内容中查看模板,或者在浏览器中查看视图源:

<div class="pt10 fontlig colr4 clearfix ulinline">
<ul id="profileInfo{profileNoId}" class="fl f14 wid83p descplist">
<li class="textTru">{age},  {height}</li>
<li class="textTru">{edu_level_new}</li>
<li class="textTru">{location}</li>
<li class="textTru">{occupation}</li>
<li class="textTru">{religion}, {caste}</li>
<li class="textTru">{income}</li>
<li class="textTru">{mtongue}</li>
<li class="textTru">{mstatus}</li>
</ul>

您可以使用selenium获取您在浏览器中看到的源代码,并将其与phantomjs结合使用以进行无头浏览:

from selenium import webdriver

dr = webdriver.PhantomJS()

dr.get('http://www.jeevansathi.com/search/quick/169903999/1')
ul = dr.find_element_by_id("profileInfo2")
print()

这会给你带有id profileInfo2 的ul,如果你想让你里面的每个li也可以使用css选择器:

lis = dr.find_elements_by_css_selector("#profileInfo2  li")

从每个文本中提取文字:

 [li.text for li in lis])

你可能想要所有你能得到的:

all_uls = dr.find_elements_by_css_selector("ul[id^=profileInfo]")

答案 1 :(得分:-1)

如果您在浏览器中禁用了javascript,则内容#profileInfo2在页面中不存在,因此如果没有javascript,它将不会显示在python中。

您可以通过使用Firefox和活动的NoScript Addon访问该站点,并在html源代码中搜索#profileInfo2来轻松验证这一点。