欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-15 13:33:46
...

工作目的

组里师兄最近遇到一个问题,他有一堆有机物化学式需要去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,感觉真的非常神奇,之后有机会再探索一下它的其他功能。