初探Selenium:获取网页中的特定标签下的文本信息

工作目的

组里师兄最近遇到一个问题,他有一堆有机物化学式需要去http://www.chemspider.com这个网站上看看有没有已知的结构和物质。他的化学式太多,一个一个查肯定效率低下,于是想用代码来做这件事。我之前也是正好瞅见过其他师兄用过selenium这个软件来做浏览器的模拟,想了一下可能自己可以试试这个东西的用法,然后就造出了下面这个代码。

代码

没空写太多废话,直接上代码:

#!/bin/python3
#coding=utf-8

from selenium import webdriver
import time
import requests
#from bs4 import BeautifulSoup as bs
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException

def get_result(formula_list):
	#headless mode configured
	ch_options = Options()
	ch_options.add_argument("--headless")

	#apply headless mode
	driver = webdriver.Chrome(chrome_options = ch_options)

	for formula in formula_list:
		url = "http://www.chemspider.com/Search.aspx?q=" + formula
		driver.get(url)
		#Sometimes scripts will be interrupted if the page is not completely loaded.
		#Using try-except structure can cover this problem.
		try:
			div = driver.find_element_by_tag_name('h3')
			text = div.get_attribute('innerText')
		except NoSuchElementException:
			driver.refresh()
		with open('E:/Denglab/代码整理/查看网页中元素/output.txt', 'a+') as f:
			f.write(formula)
			f.write('\t')
			f.write(text)
			f.write('\n')

def process_file(file):

	formula_list = [line.rstrip('\n') for line in open(file)]
	length = len(formula_list)
	#print(formula_list, length)
	return formula_list

def main():
	formula_list = process_file('E:/Denglab/代码整理/查看网页中元素/lists.txt')
	get_result(formula_list)

if __name__ =="__main__":
	main()

主要笔记

  1. 师兄给我的文件格式是一个txt,然后里面一行行的就是每个化学式,这些化学式就是检索用的,网站对于这个的检索统一格式是:http://www.chemspider.com/Search.aspx?q=加一个化学式。逐行读取的时候用到了上次学到的一个line.rstrip('\n') for line in open(file)的这个办法,超优雅啊。
  2. 经过多次尝试,发现我所需要的信息就藏在:
<div class="info fl-l">
    <h3 id="ctl00_ctl00_ContentSection_ContentPlaceHolder1_ResultStatementControl1_plhCountMessage">Found 1 result</h3>
    <span id="ctl00_ctl00_ContentSection_ContentPlaceHolder1_ResultStatementControl1_plhMessage" class="note">Search term: <b>C2H4</b> (Found by molecular formula)</span>
    <div id="ctl00_ctl00_ContentSection_ContentPlaceHolder1_ResultStatementControl1_result_statement" class="result_statement information"></div>

这个h3标签里面!然后就用

div = driver.find_element_by_tag_name('h3')
text = div.get_attribute('innerText')

来获取这个标签下的文本。

  1. 利用--headless模式来避免每次运行一次代码就要模拟打开浏览器这个过程。这个模式相当于是静默模式,让打开浏览器这个过程不用显山露水。
  2. 如果一直循环进行下去,有的时候会因为网络波动或者其他原因导致页面还没加载,元素搜索不出来的情况,于是利用了一个try-except的结构来捕获报错,并在报错的时候尝试刷新页面。这样做在我的这次实验里有效地避免了代码在报错的时候停下来的问题。

小结

这次是第一次使用Selenium,感觉真的非常神奇,之后有机会再探索一下它的其他功能。

更新

这个代码还是有一些问题,比如try-except还是不太正常。
然后我发现其实用bs4就可以简单地完成任务,不需要浏览器操作,只需网页源代码。
见:https://blog.csdn.net/Emmett_Bioinfo/article/details/114672864

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmmettPeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值