我正在尝试使用urllib2读取页面,以便从页面中提取数据。页面的一部分是每次加载生成的,当我用urllib2读取url时,这部分不在我得到的html中。
网址为http://nametrends.net/name.php?name=Ruby,我正在尝试获取为图表生成的表格。 例如:
<div aria-label="A tabular representation of the data in the chart." style="position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden;">
<table>
<tbody>
<tr><td>Sat Feb 01 1947 00:00:00 GMT-0500 (EST)</td><td>0.048</td><td>0</td></tr>
</tbody>
</table>
</div>
我目前的代码是:
import urllib2
from bs4 import BeautifulSoup
req = urllib2.Request('http://nametrends.net/name.php?name=Ruby')
response = urllib2.urlopen(req)
the_page = response.read()
html = BeautifulSoup(the_page)
print "tabular" in html
for table in html.find_all('table'):
print 1
它没有找到该表,并且html中没有div与文本表格(这是包含表格的div的标签)
答案 0 :(得分:4)
该表填充了附加XHR请求返回到getfrequencyjson.php
端点的数据。您需要在代码中发出该请求并解析JSON数据:
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36'}
with requests.Session() as session:
session.headers = headers
session.get('http://nametrends.net/name.php', params={'name': 'ruby'}, headers=headers)
response = session.get('http://nametrends.net/chartdata/getfrequencyjson.php', params={'name': 'ruby'})
results = response.json()
print results
答案 1 :(得分:2)
如果可以使用 urllib2 之外的其他选项, Selenium 可以轻松执行此类任务,并使用实际的浏览器模拟:
from selenium import webdriver
from bs4 import BeautifulSoup
url = 'http://nametrends.net/name.php?name=Ruby'
driver = webdriver.Firefox()
driver.get(url)
# wait until 'tabular' appears on browser
assert 'tabular' not in driver.page_source
html = BeautifulSoup(driver.page_source)
for table in html.find_all('table'):
print table
答案 2 :(得分:0)
一开始我会去:
bs = BeautifulSoup(the_page)
html = bs.html
你的代码看起来不好看。去...
print str(BeautifulSoup(the_page))
将显示Beautiful soup解析页面的内容。