Python请求api不是在表体内获取数据

时间:2017-07-21 15:53:39

标签: python python-3.x web-scraping python-requests urllib2

我正在尝试废弃网页以从请求响应返回的文本数据中获取表值。

</thead>
 <tbody class="stats"></tbody>
 <tbody class="annotation"></tbody>
 </table>
 </div>

实际上tbody类中存在一些数据但是`我无法使用请求访问该数据。

这是我的代码

server = "http://www.ebi.ac.uk/QuickGO/GProtein"
header = {'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; 
rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5'}
payloads = {'ac':'Q9BRY0'}
response = requests.get(server, params=payloads)

print(response.text)
#soup = BeautifulSoup(response.text, 'lxml')
#print(soup)

2 个答案:

答案 0 :(得分:1)

坦率地说,我开始对涉及硒等产品的常规刮痧失去兴趣,然后我不确定它会起作用。这种方法确实如此。

如果您要下载多个文件,至少只能以这种形式执行此操作。

>>> import bs4
>>> form = '''<form method="POST" action="GAnnotation"><input name="a" value="" type="hidden"><input name="termUse" value="ancestor" type="hidden"><input name="relType" value="IPO=" type="hidden"><input name="customRelType" value="IPOR+-?=" type="hidden"><input name="protein" value="Q9BRY0" type="hidden"><input name="tax" value="" type="hidden"><input name="qualifier" value="" type="hidden"><input name="goid" value="" type="hidden"><input name="ref" value="" type="hidden"><input name="evidence" value="" type="hidden"><input name="with" value="" type="hidden"><input name="source" value="" type="hidden"><input name="q" value="" type="hidden"><input name="col" value="proteinDB,proteinID,proteinSymbol,qualifier,goID,goName,aspect,evidence,ref,with,proteinTaxon,date,from,splice" type="hidden"><input name="select" value="normal" type="hidden"><input name="aspectSorter" value="" type="hidden"><input name="start" value="0" type="hidden"><input name="count" value="25" type="hidden"><input name="format" value="gaf" type="hidden"><input name="gz" value="false" type="hidden"><input name="limit" value="22" type="hidden"></form>'''
>>> soup = bs4.BeautifulSoup(form, 'lxml')
>>> action = soup.find('form').attrs['action']
>>> action 
'GAnnotation'
>>> inputs = soup.findAll('input')
>>> params = {}
>>> for input in inputs:
...     params[input.attrs['name']] = input.attrs['value']
...     
>>> import requests
>>> r = requests.post('http://www.ebi.ac.uk/QuickGO/GAnnotation', data=params)
>>> r
<Response [200]>
>>> open('temp.htm', 'w').write(r.text)
4082

如果您只是点击按钮,下载的文件就是您收到的文件。

Chrome浏览器的详细信息:

  • 在Chrome中打开该页面。
  • 右键单击“下载”链接。
  • 选择“检查”。
  • 在Chrome _Developer_菜单(靠近顶部)中选择“网络”,然后选择“全部”。
  • 单击页面中的“下载”。
  • - &GT;在新打开的窗口中单击“下载”。
  • 'quickgoUtil.js:36'将出现在'发起人'列中。
  • 点击它。
  • 现在,您可以通过单击其行号在`form.submit();`上设置断点。
  • 再次点击“下载”;执行将在断点处暂停。
  • 在右侧窗口中注意“本地”。其中一个内容是`form`。您可以扩展它以获取表单的内容。

您希望此元素的outerHTML属性用于上述代码中使用的信息,即其action和名称 - 值对。 (以及使用POST的隐含信息。)

现在使用请求模块向网站提交请求。

以下是params中的项目列表,以防您想要提出其他请求。

>>> for item in params.keys():
...     item, params[item]
... 
('qualifier', '')
('source', '')
('count', '25')
('protein', 'Q9BRY0')
('format', 'gaf')
('termUse', 'ancestor')
('gz', 'false')
('with', '')
('goid', '')
('start', '0')
('customRelType', 'IPOR+-?=')
('evidence', '')
('aspectSorter', '')
('tax', '')
('relType', 'IPO=')
('limit', '22')
('col', 'proteinDB,proteinID,proteinSymbol,qualifier,goID,goName,aspect,evidence,ref,with,proteinTaxon,date,from,splice')
('q', '')
('ref', '')
('select', 'normal')
('a', '')

答案 1 :(得分:0)

我从你上面的评论中得知你正在处理javascript。为了刮擦&amp;解析你可以使用selenium的javascript,这是一个可以帮助你的案例片段:

from selenium import webdriver
from bs4 import BeautifulSoup

url =''

browser = webdriver.Chrome()
browser.get(url)
soup = BeautifulSoup(browser.page_source, "lxml")
soup.prettify()

您必须安装ChromeDriver&amp; Chrome浏览器。 如果你想要你可以使用像PhantomJs这样的无头浏览器,那么你每次执行脚本时都不必处理整个chrome浏览器。