Excel单元格使用xlwings包调用python函数的公式,截取子网页(标题)的试验 问题求助CSDN_qq_27206435的博客-程序员宅基地

技术标签: python  知识信息数据  

Excel单元格使用xlwings包调用python函数的公式,截取子网页(标题)的试验 问题求助CSDN

Python 环境:python3.7 的conda上的py3环境

Excel 2010

Excel单元格布置

D114='http://mp.weixin.qq.com/s?__biz=MzU2MTgxNTE1Nw==&mid=2247484671&idx=2&sn=177e74610bd48593e6a45efb81dddc21&chksm=fc724fe5cb05c6f3df76ef025a6d8ee2c63d5385b96b2f5c13931cd3f9d46d1469486d452239&mpshare=1&scene=23&srcid=&sharer_sharetime=1574561625912&sharer_shareid=d333ff324a43c5c77fa866d86816c0fe#rd
'

E114=get_title(D114,"h2","{'class_':'rich_media_title'}")

使用的源码:文章链接索引清单简化.py

import xlwings as xw

from bs4 import BeautifulSoup
import requests
import codecs
import os
import re
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}





@xw.sub  # only required if you want to import it or run it via UDF Server
def main():
    wb = xw.Book.caller()
    wb.sheets[0].range("A1").value = "Hello xlwings!"


@xw.func
def hello(name):
    return "hello {0}".format(name)


@xw.func
def sum_two(a,b):
    return a+b

@xw.func
@xw.arg('item', doc='This is item that is found.')
@xw.arg('attr', doc='This is an attribute in dictionary  {key:value,...}.')
# @xw.arg('key', doc='This is key that is attribute.')
# @xw.arg('value', doc='This is value of the attribute above.')
def get_title(url,item,attr):#(url,item,{key:value,...}s):
    html = requests.get(url,params=headers)#补充params=
    # html = requests.request('GET',url,headers)
    soup = BeautifulSoup(html.text, 'lxml') #原文.content
    x1 =soup.find(name=item,attrs=attr)
	
    url1='https://mp.weixin.qq.com/s?__biz=MzU2MTgxNTE1Nw==&mid=2247484031&idx=2&sn=e916e47c2f6fa55703f0a3e25c1a860e&chksm=fc724965cb05c073ad331b41bb385701895f3e8f33766b5ba9ad35f78215f96003fd6f544d95&mpshare=1&scene=23&srcid=&sharer_sharetime=1574578858152&sharer_shareid=d333ff324a43c5c77fa866d86816c0fe#rd'
    html1 = requests.get(url1,headers)
    markup='''
	
	'''
	    #1=html1
		#2='<h1 style="display:inline">深度揭秘铁路 12306 的架构</h1>'
    markup1=''' <h2 class="rich_media_title" id="activity-name"> Gartner : 2019年十大数据与分析技术趋势 </h2>''' 
    markup2='''
            <div id="img-content" class="rich_media_wrp">
                
                <h2 class="rich_media_title" id="activity-name">                              Gartner : 2019年十大数据与分析技术趋势
                </h2>'''
	#注意class关键词为python保留,外部调用需要避讳,写在程序里的倒是无妨。
    soup1= BeautifulSoup(markup2, 'lxml') #soup1.text测试正常,对markup1
	                                      #soup1.prettify()测试正常  
   
	# return测试,attrs=attr传递正常  attr={'class':'rich_media_title'}
	
    x11=soup1.find(name=item,attrs=attr)  #item='h2'  ;attr={'class':'rich_media_title'} #find(name='h2',attrs={'class':'rich_media_title'})#测试正常
 
    return  x1.text#soup1.text#x11.text#content#x1.text#len(x11)#x11.text


url1='https://mp.weixin.qq.com/s?__biz=MzU2MTgxNTE1Nw==&mid=2247484031&idx=2&sn=e916e47c2f6fa55703f0a3e25c1a860e&chksm=fc724965cb05c073ad331b41bb385701895f3e8f33766b5ba9ad35f78215f96003fd6f544d95&mpshare=1&scene=23&srcid=&sharer_sharetime=1574578858152&sharer_shareid=d333ff324a43c5c77fa866d86816c0fe#rd'
# print('测试截取的网页:',get_title(url1,item,attr))
# get_title(url1,item,attr)

if __name__ == "__main__":
    xw.books.active.set_mock_caller()
    main()
    # get_title(url1,item,attr)
    # print('测试截取的网页:',get_title(url1,item,attr))
#先导入 from 文章链接索引清单 import get_title;再调用get_title(url,item,attr);
    #return x1.text#.string #len(x1)#.string 都试过
	#重点:获取tag内容有三种方法,string方法不能处理标签中含有标签的内容,获取为None;text和get_text可以获取。
	#tag.string,soup1.string 返回空
	#type(soup1.string),type(tag.string)   #出错 "Unexpected Python Error: TypeError: Objects of type 'type' can not be converted to a COM VARIANT"
	#soup1.name返回[document]
	#.get_text()[0],返回空
	#1,测试可以正常返回
	# x1这才是完整的元素,.get_text()和.get都不完整,都是截取的

试验结果 征求错误解决方法,Excel公式调用的python函数期望能正常返回抓取的微信页面标题

"    return  x
  File ""e:\鏂板叴it銆乨t棰嗗煙璧勬枡\dt\澶ф暟鎹椂浠e皬鏁版嵁鍒嗘瀽-28.5g\澶ф暟鎹功绫?璁哄潧绛夎祫婧愮粍缁嘰寰俊鍏紬鍙疯祫婧?閾炬帴娓呭崟\澶ф暟鎹垎鏋愭寲鎺樺拰python鏈哄櫒瀛︿範 鍏紬鍙锋枃绔犻摼鎺ョ储寮曟竻鍗昞鏂囩珷閾炬帴绱㈠紩娓呭崟\鏂囩珷閾炬帴绱㈠紩娓呭崟.py"", line 3140, in get_title
    ret = func(*args)
  File ""D:\ProgramData\Miniconda2\envs\py3\lib\site-packages\xlwings\udfs.py"", line 314, in call_udf
    res = call_udf(script, fname, args, this_workbook, FromVariant(caller))
  File ""D:\ProgramData\Miniconda2\envs\py3\lib\site-packages\xlwings\server.py"", line 198, in CallUDF
    return func(*args)
  File ""D:\ProgramData\Miniconda2\envs\py3\lib\site-packages\win32com\server\policy.py"", line 586, in _invokeex_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File ""D:\ProgramData\Miniconda2\envs\py3\lib\site-packages\win32com\server\policy.py"", line 283, in _invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File ""D:\ProgramData\Miniconda2\envs\py3\lib\site-packages\win32com\server\policy.py"", line 278, in _Invoke_"

命令行执行 效果良好

>python -c "import 文章链接索引清单简化; url='https://mp.weixin.qq.com/s?__biz=MzU2MTgxNTE1Nw==&mid=2247484671&idx=2&sn=177e74610bd48593e6a45efb81dddc21&chksm=fc724fe5cb05c6f3df76ef025a6d8ee2c63d5385b96b2f5c13931cd3f9d46d1469486d452239&mpshare=1&scene=23&srcid=&sharer_sharetime=1574561625912&sharer_shareid=d333ff324a43c5c77fa866d86816c0fe#rd';item= 'h2' ;attr={'class':'rich_media_title'};s=文章链接索引清单简化.get_title(url,item,attr);print('s=',s)" 

试验结果

s=



北大开源了Python中文分词工具包,准确度远超Jieba


(py3) E:\新兴IT、DT领域资料\DT\大数据时代小数据分析-28.5G\大数据书籍 论坛等资源 组织\微信公众号资源 链接清单\大数据分析挖掘和Python机器学习 公众号文章链接索引清单\文章链接索引清单>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27206435/article/details/103915581

智能推荐

C++ 随机函数_c++随机数-程序员宅基地

1.产生随机数: rand():内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。 rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。 所在的头文件:#include &lt;cstdlib&gt; // 标准..._c++随机数

机房重构之数据库设计-程序员宅基地

之前一段时间都在弄论文,但是敲论文的时候一个很小的问题,都让我很灰心,苦于找不到很好的解决方法,参考了很多书,还是不得要领,不想在论文上在耽误时间了,所以决定向机房进发,重构机房如果遇到问题好歹还能问问身边的小伙伴们,机房搞定了,论文就简单了。汲取第一次机房的教训,这次遇到问题一定要好好的总结,找一个切入口,迅速进入状态,把工程化成一小步一小步去做,一个功能一个功能的去实现,不要想一口吃个胖子,也

input值变化监听事件_input值改变监听-程序员宅基地

一.input monitor function1. onchange()onchange 事件会在域的内容改变时触发.支持的标签<input type="text">, <textarea>, <select>,<keygen>.注意:在元素的值改变了且失去焦点时触发(两次的值一样不会触发).缺陷:通过js代码改变DOM..._input值改变监听

Android Studio运行你的APP_android studio 随便走app-程序员宅基地

## 在真实设备上运行 ##将你的设备(手机)连接到你的开发机器上,在手机设置中找到开发者选项。在Android Studio 中选择然后点击OK在虚拟机上运行1.点击 或则点击Tools > Android > AVD Manager, 创建一个AVD(安卓虚拟设备) 2.点击Create Virtual Device. 3.选择你想创建的虚拟设备 4.选择你设备的系统版本 5_android studio 随便走app

JS 获取当前时间函数_js获取当前时间的函数-程序员宅基地

function getTime() { var time = new Date();//time为现在的时间 //结果: Sun Sep 19 2021 20:25:30 GMT+0800 (中国标准时间) var year = time.getFullYear();//获取现在的年份 var month = time.getMonth() + 1;//获取现在的月份 var date = time.getDate();//获取现在的日期 date ._js获取当前时间的函数

ASP.NET Core中的配置文件_asp.net数据库配置文件-程序员宅基地

启动配置信息项目启动的时候,将会获取launchsettings.json设置信息。我们可以在项目根目录的Properties文件夹中找到此文件当我们使用Visual Studio或.NET Core CLI运行此ASP.NET Core项目时,将使用此文件中的设置此文件仅用于本地开发环境,我们不需要把它发布到生产环境的ASP.NET Core程序中如果希望在使用ASP.NET Core发布和部署应用程序时采用某些独立的设置,请将它们存储在appsettings.json文件中。我们通常将应用程_asp.net数据库配置文件

随便推点

Linux下3G脚本拨号上网(转)-程序员宅基地

Linux下3G脚本拨号上网(2010-7-513:08) 既然是拨号上网,就不能不提到ppp(point-to-point protocol)协议.ppp协议提供了一种通过串行点对点联接传输数据报的方式.它由三部份组成:一种在串行封装数据报的方式,扩展联接控制协议LCP,和用来建立和配置不同网络层协议的家族网络控制协议NCP.封装方案由内核驱动代码来提供.pppd(pp...

时序分析基本概念介绍<OCV>-程序员宅基地

今天我们要介绍的时序分析概念是on chip variations,简称OCV。OCV会对时序分析提出更严格的要求。那为什么需要OCV呢,因为制造工艺的限制,同一芯片上不..._pt时序分析中ocv按悲观程度排序

解决Linux无法上网的各种问题_linux lianbushangwang-程序员宅基地

最近发现Linux重新开机后无法上网,不仅不能ping通windows主机也不能上外网。ifconfig后eth0也没有分配IP地址,总之各种问题都被我碰到了。现在来一一解决!1、没有分配到IP地址开机后联网图标上有叉叉,ifconfig后eth0没有分配到ip地址,如图:原因:虚拟机的网络设置错误,点击vMware下的虚拟机->设置,选择网络设置。里面有3个选项:桥接模块:Linux虚拟机可以自动分配到IP地址,外网可以访问虚拟机,这种情况需要保证路由器能够提供多个IP._linux lianbushangwang

ES6 箭头函数、参数默认值、拓展运算符、rest运算符-程序员宅基地

上方代码中,我们往往 arr2 里添加了`你懂的`,却发现,arr1 里也有这个内容。原因是:`let arr2 = arr1;`其实是让 arr2 指向 arr1 的地址。也就是说,二者指向的是同一个内存地址。如果不想让 arr1 和 arr2 指向同一个内存地址,我们可以借助扩展运算符来做:

Oracle 12C OCP-071最新考试题库及答案-19-程序员宅基地

1.choose the best answerWhat is the primary difference between the relational database (RDB) andobject-oriented database (OODB) models?A) RDB allows the definition of relationships between differen...

【每日一题】LeetCode. 236. 二叉树的最近公共祖先_给定一个二叉树,求其中n(n≥2)个节点的最近公共祖先节点,每个节点只有左右孩-程序员宅基地

每日一题,防止痴呆 = =一、题目大意给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowes._给定一个二叉树,求其中n(n≥2)个节点的最近公共祖先节点,每个节点只有左右孩