python怎么爬取python shadow namedom 中的css seletor

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
利用python中的scrapy框架的css选择器对具体标签内容进行获取,但是获取不到内容。当前网页源码(是js渲染之前的代码):
css选择器代码:urllist = response.css('ul.nav li a::attr(href)')[0::3].extract()运行结果是:urllist===================[]urllist长度============ 0css选择器内的代码应该是没有错误的,为什么获取不到内容?由于怀疑是css选择器出现了问题,因此替换xpath选择器,xpath选择器代码:urllist=response.xpath('//ul[ ="nav"]/li/a/@href').extract()但是运行结果和css选择器相同。内容仍为空,长度为0
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你试试 在命令行里面使用scrapy shell 加目标url 然后可以得到一个response对象,先看下这个response对象是否是正常的,可以先看下response.body,看下是不是你想要爬取的网页的源代码然后用这个response对象去调试你的css选择器的代码
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
利用python中的scrapy框架的css选择器对具体标签内容进行获取,但是获取不到内容。当前网页源码(是js渲染之前的代码):
css选择器代码:urllist = response.css('ul.nav li a::attr(href)')[0::3].extract()运行结果是:urllist===================[]urllist长度============ 0css选择器内的代码应该是没有错误的,为什么获取不到内容?由于怀疑是css选择器出现了问题,因此替换xpath选择器,xpath选择器代码:urllist=response.xpath('//ul[ ="nav"]/li/a/@href').extract()但是运行结果和css选择器相同。内容仍为空,长度为0
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
或许你的问题不是出在css选择器代码上,检查下response内容是否与网页上看到的内容一致
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你试试 在命令行里面使用scrapy shell 加目标url 然后可以得到一个response对象,先看下这个response对象是否是正常的,可以先看下response.body,看下是不是你想要爬取的网页的源代码然后用这个response对象去调试你的css选择器的代码
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。大神:python怎么爬取js的页面_百度知道
大神:python怎么爬取js的页面
我有更好的答案
js代码是需要js引擎运行的,Python只能通过HTTP请求获取到HTML、CSS、JS原始代码而已。不知道有没有用Python编写的JS引擎
实战化教学领导品牌
主营:计算机技术培训
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。HTML5 ShadowDOM & CustomElements - 简书
HTML5 ShadowDOM & CustomElements
Web组件由四部分组成
Shadow DOM (Chrome Opera支持)
Custom Elements
Shadow DOM 组成
Shadow DOM可以和一个根节点Shadow root关联, 该Shadow DOM元素称为Shadow Host内容不会被渲染, 而Shadow root内容会被渲染。
但是,内容不应该放进Shadow DOM内, 以便被搜索引擎 阅读器等访问到, 可重用部件无意义的标记应该放进Shadow DOM中
Shadow DOM从展现中分离细节
内容在文档内;展现在 Shadow DOM 里。 当需要更新的时候,浏览器会自动保持它们的同步。
&template&
&div class="outer"&
&div class="boilerplate"&
Hi! My name is
&div class="name"&
&content&&/content&
&/template&
var shadow = document.querySelector('#nameTag').createShadowRoot();
var template = document.querySelector('#nameTagTemplate');
var clone = document.importNode(template.content, true);
shadow.appendChild(clone);
document.querySelector("#nameTag").textContent = "Shellie"
&div id="nameTag"&&/div&
通过select特性, 可以使用多个元素并控制投射元素
&!-- Shadow DOM --&
&div style="background: padding: 1"&
&div style="color:"&
&content select=".first"&&/content&
&div style="color:"&
&content select="div"&&/content&
&div style="color:"&
&content select=".email"&&/content&
&!-- DOM --&
&div id="nameTag"&
&div class="first"&Bob&/div&
&div&B. Love&/div&
&div class="email"&bob@&/div&
Shadow DOM 样式
Shadow DOM定义的CSS样式只在Shadow Root下生效, 样式被封装起来
样式化宿主元素(host element)
:host样式化Shadow DOM元素, 并且无法影响到Shadow DOM外的元素
:host(x-bar:host) {
/* 当宿主是 &x-bar& 元素时生效。 */
:host(.different:host) {
/* 当宿主的类 &class="diffent"& 时生效。 */
:host:hover {
/* 当鼠标放置到宿主上时生效。 */
opacity: 1;
^(Hat) 和 ^^(Cat)选择器
^ 连接符等价于后代选择器(例如 div p {...}),只不过它能跨越 一个 shadow 边界。
^^ 后代选择器能够跨越 任意数量的 shadow 边界。
querySelector()支持该选择器
可以通过 shadowdom 样式化原生HTML控件
video ^ input[type="range"] {
background:
插入点重置样式
var root = document.querySelector('div').createShadowRoot();
root.resetStyleInheritance =
reset-style-inheritance:
在插入点, 选择是否继承上级样式(只影响可继承的样式)
::content 伪元素 穿过插入点来指定样式
&h3&Light DOM&/h3&
&div&I'm not underlined&/div&
&p&I'm underlined in Shadow DOM!&/p&
&/section&
var div = document.querySelector('div');
var root = div.createShadowRoot();
root.innerHTML = '\
h3 { color: }\
content[select="h3"]::content & h3 {\
::content section p {\
text-decoration:\
&h3&Shadow DOM&/h3&\
&content select="h3"&&/content&\
&content select="section"&&/content&';
对于一个 ShadowRoot 或 &shadow& 插入点:reset-style-inheritance 意味着可继承的 CSS 属性在宿主元素处被设置为 initial,此时这些属性还没有对 shadow 中的内容生效。该位置称为上边界(upper boundary)。
对于 &content& 插入点:reset-style-inheritance 意味着在宿主的子元素分发到插入点之前,将可继承的 CSS 属性设置为 initial。该位置称为下边界(lower boundary)。
使用多个shadowdom
最近添加的树称为 younger tree。之前添加的树称为 older tree。
添加进宿主元素中的 shadow 树按照它们的添加顺序而堆叠起来,从最先加入的 shadow 树开始。最终渲染的是最后加入的 shadow 树。
如果一个 shadow 树中存在多个 &shadow& 插入点,那么仅第一个被确认,其余的被忽略。
"Shadow 插入点" (&shadow&) 作为占位符可以插入 ShadowDOM
普通插入点 (&content&) 作为占位符可以插入 普通DOM元素
如果一个元素托管着 Shadow DOM,你可以使用 .shadowRoot 来访问它的 youngest shadow root
如果不想别人乱动你的 shadow,那就将 .shadowRoot 重定义为 null:
Object.defineProperty(host, 'shadowRoot', {
get: function() { },
set: function(value) { }
JS中构建 shadowdom
可以使用 HTMLContentElement 和 HTMLShadowElement 接口。
使用插入点从宿主元素中选择并"分发"到 shadow 树
无法遍历 &content& 中的 DOM。
.getDistributedNodes() 允许我们查询一个插入点的分布式节点:
&div id="example4"&
&h2&Eric&/h2&
&h2&Bidelman&/h2&
&div&Digital Jedi&/div&
&h4&footer text&/h4&
&template id="sdom"&
&content select="h2"&&/content&
&content select="div"&&/content&
&/section&
&content select="h4:first-of-type"&&/content&
&/template&
var container = document.querySelector('#example4');
var root = container.createShadowRoot();
var t = document.querySelector('#sdom');
var clone = document.importNode(t.content, true);
root.appendChild(clone);
var html = [];
[].forEach.call(root.querySelectorAll('content'), function(el) {
html.push(el.outerHTML + ': ');
var nodes = el.getDistributedNodes();
[].forEach.call(nodes, function(node) {
html.push(node.outerHTML);
html.push('\n');
可以在分布式节点上调用它的 .getDestinationInsertionPoints() 来查看它被分发进了哪个插入点中
&div id="host"&
&h2&Light DOM&/h2&
var container = document.querySelector('div');
var root1 = container.createShadowRoot();
var root2 = container.createShadowRoot();
root1.innerHTML = '&content select="h2"&&/content&';
root2.innerHTML = '&shadow&&/shadow&';
var h2 = document.querySelector('#host h2');
var insertionPoints = h2.getDestinationInsertionPoints();
[].forEach.call(insertionPoints, function(contentEl) {
console.log(contentEl);
Shadow DOM 可视化渲染工具:
shadowdom 事件模型
事件会被重定向,使它看起来是从宿主元素上发出,而并非是 Shadow DOM 的内部元素。(event.path 来查看调整后的事件路径。)
以下事件永远无法越过 shadow 边界:
selectstart
自定义元素
定义新的 HTML/DOM 元素
基于其他元素创建扩展元素
给一个标签绑定一组自定义功能
扩展已有 DOM 元素的 API
注册新元素
document.registerElement() 可以创建一个自定义元素
第一个参数是元素的标签名。这个标签名必须包括一个连字符(-)。
第二个参数是一个(可选的)对象,用于描述该元素的 prototype。在这里可以为元素添加自定义功能(例如:公开属性和方法)。
var XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype)
// 非全局创建新元素, 可以放置到自己的命名空间内
var myapp = {};
myapp.XFoo = document.registerElement('x-foo');
// 扩展原生元素 要创建扩展自元素 B 的元素 A,元素 A 必须继承元素 B 的 prototype。
var MegaButton = document.registerElement('mega-button', {
prototype: Object.create(HTMLButtonElement.prototype)
// 以下方法为重载版本
var megaButton = document.createElement('button', 'mega-button');
// &button is="mega-button"&
添加JS属性和方法
var XFooProto = Object.create(HTMLElement.prototype);
// 1. 为 x-foo 创建 foo() 方法
XFooProto.foo = function() {
alert('foo() called');
// 2. 定义一个只读的“bar”属性
Object.defineProperty(XFooProto, "bar", {value: 5});
// 3. 注册 x-foo 的定义
var XFoo = document.registerElement('x-foo', {prototype: XFooProto});
// 4. 创建一个 x-foo 实例
var xfoo = document.createElement('x-foo');
// 5. 插入页面
document.body.appendChild(xfoo);
/* 更简洁的方式 */
var XFoo = document.registerElement('x-foo', {
prototype: Object.create(HTMLElement.prototype, {
get: function() { return 5; }
value: function() {
alert('foo() called');
生命周期回调方法
调用时间点
createdCallback
创建元素实例
attachedCallback
向文档插入实例
detachedCallback
从文档中移除实例
attributeChangedCallback(attrName, oldVal, newVal)
添加,移除,或修改一个属性
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function() {
this.addEventListener('click', function(e) {
alert('Thanks!');
this.innerHTML = "&b&I'm an x-foo!&/b&";
proto.attachedCallback = function() {...};
var XFoo = document.registerElement('x-foo', {prototype: proto});
用 Shadow DOM 封装内部实现
一种隐藏内部实现的方法,从而将用户与血淋淋的实现细节隔离开。
简单有效的样式隔离。
从 Shadow DOM 创建元素,跟创建一个渲染基础标记的元素非常类似,区别在于 createdCallback() 回调:
var XFooProto = Object.create(HTMLElement.prototype);
XFooProto.createdCallback = function() {
// 1. 为元素附加一个 shadow root。
var shadow = this.createShadowRoot();
// 2. 填入标记。
shadow.innerHTML = "&b&I'm in the element's Shadow DOM!&/b&";
var XFoo = document.registerElement('x-foo-shadowdom', {prototype: XFooProto});
从模板创建元素
&template id="sdtemplate"&
p { color: }
&p&I'm in Shadow DOM. My markup was stamped from a &template&.&/p&
&/template&
var proto = Object.create(HTMLElement.prototype, {
createdCallback: {
value: function() {
var t = document.querySelector('#sdtemplate');
var clone = document.importNode(t.content, true);
this.createShadowRoot().appendChild(clone);
document.registerElement('x-foo-from-template', {prototype: proto});
为自定义元素增加样式
app-panel {
[is="x-item"] {
transition: opacity 400ms ease-in-
opacity: 0.3;
text-align:
border-radius: 50%;
[is="x-item"]:hover {
opacity: 1.0;
background: rgb(255, 0, 255);
app-panel & [is="x-item"] {
padding: 5
list-style:
margin: 0 7
&app-panel&
&li is="x-item"&Do&/li&
&li is="x-item"&Re&/li&
&li is="x-item"&Mi&/li&
&/app-panel&
为使用 Shadow DOM 的元素增加样式
使用 :unresolved 伪类避免无样式内容闪烁(FOUC)
使用 :unresolved 伪类避免无样式内容闪烁(FOUC)
注册后渐显的 &x-foo& 标签:
opacity: 1;
transition: opacity 300
x-foo:unresolved {
opacity: 0;
:unresolved 伪类只能用于 unresolved 元素,而不能用于继承自 HTMLUnkownElement 的元素
/* 给所有 unresolved 元素添加边框 */
:unresolved {
display: inline-
/* unresolved 元素 x-panel 的文本内容为红色 */
x-panel:unresolved {
/* 定义注册后的 x-panel 文本内容为绿色 */
padding: 5
I'm black because :unresolved doesn't apply to "panel".
It's not a valid custom element name.
&x-panel&I'm red because I match x-panel:unresolved.&/x-panel&
历史和浏览器支持
检查 document.registerElement() 是否存在:
function supportsCustomElements() {
return 'registerElement'
if (supportsCustomElements()) {
// Good to go!
// Use other libraries to create components.
从事web端的开发,热爱编码,全端工程师进击中,欢迎加我微信 ^_^
CSS 绝对底部 - 前端 - 掘金来自国外的设计达人,纯CSS,可以实现: 当正文内容很少时,底部位于窗口最下面。当改变窗口高度时,不会出现重叠问题。甚至,创造该CSS的人还专门成立一个网站介绍这个CSS底部布局方案。不知道他有没有去申请专利:)&!DOCTYPE htm...
问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。碰到频率:100%解决方案:CSS里 {margin...
一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.com/download/
,这里需要注意 jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于** 2.x 不再兼容 IE6、7、8浏览器,这样...
简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.com到你看到google主页过程中都发生了什么。将讨论的浏览器今天,有五种主流浏览器——IE、Firefox、Safari、Chrome及Opera。本文将基于...
每天最少要吃12种食物,一周要吃25种不同的食物。有一个小孩子,他吃饭吃太快,所以就当常死亡。我们要慢慢吃饭,不要很快的吃饭,这样容易噎到。每天都要吃的,觉得饱了就不吃了。
如果你拉出来的便便是一长条一长条的,就说明你的身体很健康,如果你拉出来的便便是一...
作者~初海刚- 高纯活化凝胶地龙抗菌肽纳米银妇科凝胶 【产品性能】 具有消炎、杀菌、止痒作用。对金黄色葡萄球菌、大肠杆菌、淋球菌、白色念珠球菌、真菌、酵母菌等病原体微生物的生长有明显抑制作用。 【适用范围】 该产品适用于抗菌消炎 、修复再生,对于真菌、...
今天的团队小晚宴 文/能量波 日 天津 瑞康点拨 1.这是你的主体验吗? 2.最近你体验艰难吗? 3.你写的作业有人看吗? 4.你的惰性细胞又出来了吗? 5.你重视你每一天的工作吗? 6.你的艰难不需要你去体验吗? 7.今天看你能量弱你就休息了一下午? 8....
??????我的读后感 ???人这一生中总有很多次关键对话的时刻。 ???比如关键性的面试,向心爱的女孩求婚,面对一个艰苦的商业谈判,和自己的老婆吵架…… ?你有多少次因为不会面对关键对话而丧失机会?尽管你深深自责,但苦于找不到合适的方法来改善自己,只能归咎于自己心理不够强...
少年噙着泪重物一般倚坐在巷弄里 像凡尔赛古老的画集,像山溪独栖的沉鱼 静默成云,半晌无声。 夜晚流墨般涂刷了白昼不休的城市 街道虚实难辨,建筑物被切磨成粗糙的线条。 他沿着风向挪动,左半身泼满灯光。 巷子深处踱来一只莹白的猫咪 白羽轻合,毛发细柔 近在咫尺却又遥不可及。 它...没有更多推荐了,
不良信息举报
举报内容:
jsoup抓取页面与页面解析提取数据
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 shadowdsocks python 的文章

 

随机推荐