‘壹’ python怎样使用正则表达式获得html标签数据
正则的话
import re
html = "<a href='xxx.xxx' title='xxx.xxx.xxx'>sample text1</a>abcdef<a href='xxx.xxx' title='xxx.xxx.xxx'>sample text2</a>"
result = map(lambda name: re.sub("<a href=.*?>","",name.strip().replace("</a>","")), re.findall("<a href=.*?>.*?</a>",html))
print result
上面代码会把所有a tag里的东西存在result这个list里面。另外python有个模块叫Beautiful Soup,专门用来处理html的,你有空可以看下
‘贰’ python如何读取网页中的数据
用Beautiful Soup这类解析模块:
Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree);
它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作;
用urllib或者urllib2(推荐)将页面的html代码下载后,用beautifulsoup解析该html;
然后用beautifulsoup的查找模块或者正则匹配将你想获得的内容找出来,就可以进行相关处理了,例如:
html='<html><head><title>test</title></head><body><p>testbody</p></body></html>'
soup=BeautifulSoup(html)
soup.contents[0].name
#u'html'
soup.comtents[0].contents[0].name
#u'head'
head=soup.comtents[0].contents[0]
head.parent.name
#u'html'
head.next
#u'<title>test</title>
‘叁’ 如何利用Python爬虫从网页上批量获取想要的信息
稍微说一下背景,当时我想研究蛋白质与小分子的复合物在空间三维结构上的一些规律,首先得有数据啊,数据从哪里来?就是从一个涵盖所有已经解析三维结构的蛋白质-小分子复合物的数据库里面下载。这时候,手动一个个去下显然是不可取的,我们需要写个脚本,能从特定的网站选择性得批量下载需要的信息。python是不错的选择。
import urllib #python中用于获取网站的模块
import urllib2, cookielib
有些网站访问时需要cookie的,python处理cookie代码如下:
cj = cookielib.CookieJar ( )
opener = urllib2.build_opener( urllib2.HttpCookieProcessor(cj) )
urllib2.install_opener (opener)
通常我们需要在网站中搜索得到我们需要的信息,这里分为二种情况:
1. 第一种,直接改变网址就可以得到你想要搜索的页面:
def GetWebPage( x ): #我们定义一个获取页面的函数,x 是用于呈递你在页面中搜索的内容的参数
url = 'http://xxxxx/xxx.cgi?&' + ‘你想要搜索的参数’ # 结合自己页面情况适当修改
page = urllib2.urlopen(url)
pageContent = page.read( )
return pageContent #返回的是HTML格式的页面信息
2.第二种,你需要用到post方法,将你搜索的内容放在postdata里面,然后返回你需要的页面
def GetWebPage( x ): #我们定义一个获取页面的函数,x 是用于呈递你在页面中搜索的内容的参数
url = 'http://xxxxx/xxx' #这个网址是你进入搜索界面的网址
postData = urllib.urlencode( { 各种‘post’参数输入 } ) #这里面的post参数输入需要自己去查
req= urllib2.Request (url, postData)
pageContent = urllib2.urlopen (req). read( )
return pageContent #返回的是HTML格式的页面信息
在获取了我们需要的网页信息之后,我们需要从获得的网页中进一步获取我们需要的信息,这里我推荐使用 BeautifulSoup 这个模块, python自带的没有,可以自行网络谷歌下载安装。 BeautifulSoup 翻译就是‘美味的汤’,你需要做的是从一锅汤里面找到你喜欢吃的东西。
import re # 正则表达式,用于匹配字符
from bs4 import BeautifulSoup # 导入BeautifulSoup 模块
soup = BeautifulSoup(pageContent) #pageContent就是上面我们搜索得到的页面
soup就是 HTML 中所有的标签(tag)BeautifulSoup处理格式化后的字符串,一个标准的tag形式为:
hwkobe24
通过一些过滤方法,我们可以从soup中获取我们需要的信息:
(1) find_all ( name , attrs , recursive , text , **kwargs)
这里面,我们通过添加对标签的约束来获取需要的标签列表, 比如 soup.find_all ('p') 就是寻找名字为‘p’的 标签,而soup.find_all (class = "tittle") 就是找到所有class属性为"tittle" 的标签,以及soup.find_all ( class = re.compile('lass')) 表示 class属性中包含‘lass’的所有标签,这里用到了正则表达式(可以自己学习一下,非常有用滴)
当我们获取了所有想要标签的列表之后,遍历这个列表,再获取标签中你需要的内容,通常我们需要标签中的文字部分,也就是网页中显示出来的文字,代码如下:
tagList = soup.find_all (class="tittle") #如果标签比较复杂,可以用多个过滤条件使过滤更加严格
for tag in tagList:
print tag.text
f.write ( str(tag.text) ) #将这些信息写入本地文件中以后使用
(2)find( name , attrs , recursive , text , **kwargs )
它与 find_all( ) 方法唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果
(3)find_parents( ) find_parent( )
find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等. find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容
(4)find_next_siblings() find_next_sibling()
这2个方法通过 .next_siblings 属性对当 tag 的所有后面解析的兄弟 tag 节点进代, find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点
(5)find_previous_siblings() find_previous_sibling()
这2个方法通过 .previous_siblings 属性对当前 tag 的前面解析的兄弟 tag 节点进行迭代, find_previous_siblings()方法返回所有符合条件的前面的兄弟节点, find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点
(6)find_all_next() find_next()
这2个方法通过 .next_elements 属性对当前 tag 的之后的 tag 和字符串进行迭代, find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点
(7)find_all_previous() 和 find_previous()
这2个方法通过 .previous_elements 属性对当前节点前面的 tag 和字符串进行迭代, find_all_previous() 方法返回所有符合条件的节点, find_previous()方法返回第一个符合条件的节点
具体的使用方法还有很多,用到这里你应该可以解决大部分问题了,如果要更深入了解可以参考官方的使用说明哈!
‘肆’ python进行数据库查询时怎么把结果提取出来
设置索引字段。在开始提取数据前,先将member_id列设置为索引字段。然后开始提取数据。
按行提取信息。第一步是按行提取数据,例如提取某个用户的信息。
按列提取信息。第二步是按列提取数据,例如提取用户工作年限列的所有信息。
按行与列提取信息。第三步是按行和列提取信息,把前面两部的查询条件放在一起,查询特定用户的特定信息。
在前面的基础上继续增加条件,增加一行同时查询两个特定用户的贷款金额信息。
在前面的代码后增加sum函数,对结果进行求和。
除了增加行的查询条件以外,还可以增加列的查询条件。
多个列的查询也可以进行求和计算,在前面的代码后增加sum函数,对这个用户的贷款金额和年收入两个字段求和,并显示出结果。
提取特定日期的信息。数据提取中还有一种很常见的需求就是按日期维度对数据进行汇总和提取,如按月,季度的汇总数据提取和按特定时间段的数据提取等等。
设置索引字段。首先将索引字段改为数据表中的日期字段,这里将issue_d设置为数据表的索引字段。按日期进行查询和数据提取。
‘伍’ 如何用python抓取网页上的数据
使用内置的包来抓取,就是在模仿浏览器访问页面,再把页面的数据给解析出来,也可以看做是一次请求。
‘陆’ 如何用python抓取网页数据库
最简单可以用urllib,python2.x和python3.x的用法不同,以python2.x为例:
import
urllib
html
=
urllib.open(url)
text
=
html.read()
复杂些可以用requests库,支持各种请求类型,支持cookies,header等
再复杂些的可以用selenium,支持抓取javascript产生的文本
‘柒’ 如何用python把返回的html提取相应的内容到excel
解决方法:
正则提取出多个列表,然后利用 Pandas 的 DataFrame 数据类型写入 excel,具体格式你自己安排,这里给出个基本示例:
text = """<td height="20" align="center">1</td>
<td align="center">产品</td>
<td align="center">red</td>
<td align="center">单价</td>
<td align="center">价格</td>
<td align="center">备注</td>
<td height="20" align="center">2</td>
<td align="center">产品</td>
<td align="center">red</td>
<td align="center">单价</td>
<td align="center">价格</td>
<td align="center">备注</td>
import pandas as pd
import re
p = re.compile('>(\S+)</td>')
q = p.findall(text)
table = pd.read_excel(r'D:\test.xlsx')
table['your title'] = pd.Series(q)
table.to_excel(r'D:\test.xlsx')
‘捌’ python HTML处理
[<tdstyle="text-align:center">2014-12-31</td>,<tdstyle="text-align:center">6.16</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>1.76</td>]
[<tdstyle="text-align:center">2013-12-31</td>,<tdstyle="text-align:center">11.47</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>1.72</td>]
[<tdstyle="text-align:center">2012-12-31</td>,<tdstyle="text-align:center">-5.5</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>4.31</td>]
[<tdstyle="text-align:center">2011-12-31</td>,<tdstyle="text-align:center">14.83</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.53</td>]
[<tdstyle="text-align:center">2010-12-31</td>,<tdstyle="text-align:center">1.8</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.63</td>]
[<tdstyle="text-align:center">2009-12-31</td>,<tdstyle="text-align:center">21.69</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>5.61</td>]
[<tdstyle="text-align:center">2008-12-31</td>,<tdstyle="text-align:center">0.19</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.03</td>]
[<tdstyle="text-align:center">2007-12-31</td>,<tdstyle="text-align:center">2.89</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>0.77</td>]
[<tdstyle="text-align:center">2006-12-31</td>,<tdstyle="text-align:center">7.37</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>2.71</td>]
[<tdstyle="text-align:center">2005-12-31</td>,<tdstyle="text-align:center">3.99</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>28.66</td>]
[<tdstyle="text-align:center">2004-12-31</td>,<tdstyle="text-align:center">-132.62</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>78.84</td>]
[<tdstyle="text-align:center">2003-12-31</td>,<tdstyle="text-align:center">23.79</td>,<tdstyle="text-align:center">听</td>]
[<tdstyle="text-align:center">2002-12-31</td>,<tdstyle="text-align:center">-759.2139</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>745.9739</td>]
[<tdstyle="text-align:center">2001-12-31</td>,<tdstyle="text-align:center">-5.47</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>6.852</td>]
[<tdstyle="text-align:center">2000-12-31</td>,<tdstyle="text-align:center">6.82</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>3.95</td>]
[<tdstyle="text-align:center">1999-12-31</td>,<tdstyle="text-align:center">10.48</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>6.87</td>]
[<tdstyle="text-align:center">1998-12-31</td>,<tdstyle="text-align:center">12.28</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>7.21</td>]
[<tdstyle="text-align:center">1997-12-31</td>,<tdstyle="text-align:center">54</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>18</td>]
[<tdstyle="text-align:center">1996-12-31</td>,<tdstyle="text-align:center">72</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>7</td>]
[<tdstyle="text-align:center">1995-12-31</td>,<tdstyle="text-align:center">65</td>,<tdstyle="text-align:center">听</td>]
不止2004年的数据
我修改了下你的代码用的requests的库
importos
importsys
importtime
importrequests
importbs4
frompprintimportpprint
roe=open('ROE.txt','w')
req="http://vip.stock.finance.sina.com.cn/corp/view/vFD_FinancialGuideLineHistory.php?stockid=600159&typecode=financialratios59"
soup=bs4.BeautifulSoup(requests.get(req,timeout=30).text)
buffer=soup.find(id='Table1')
rows=buffer.find_all('tr')
forrowinrows:
cols=row.find_all('td')
text=str(cols)
if"-12-31"intext:
roe.write(text+' ')
time.sleep(2)
roe.close()