Python Scrapy 爬虫教程之选择器 Selectors

Selectors

在抓取一个web页面的时候,大多数任务在于从HTML源中提取数据。有很多可用的的库支持这些操作,比如:

  • BeautifulSoup:这是一个在 Python 编程中非常流行的网页抓取库,它依照HTML代码的结构来构造 Python 对象,并且能正确处理不良标记,但是它有一个弱项:太慢
  • lxml:以非常 python 化的 ElementTree 接口为基础,建立 XML 解析库(同时也能解析 HTML)

Scrapy 有自己的提取数据的机制。它们称之为 selectors(选择器),因为从 HTML 文档中筛选特定内容,可以使用XPathCSS表达式。

XPath是一个筛选 XML 文档节点的语言,也能用于筛选 HTML 文档。
CSS 是一个应用格式到 HTML 文档的语言,它定义选择器与特定 HTML 元素格式之间的关系。

注意:
Scrapy 选择器是 `parsel` 库的轻量级再封装;封装的目的是为了与 Scrapy 响应对象提供更好的整合。
`parsel` 是一个独立的网页抓取库,可以不依赖于 Scrapy。它使用 `lxml` 库作为底层引擎,并且在 lxml 顶层接口再实现了一个简单API。这意味着 Scrapy 选择器的速度与解析准确性与 lxml 十分接近。

一、使用选择器

scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html 为例

1.1 构建选择器

使用 .selector 暴露 Response 对象的 Selector 实例:

In [4]: response.selector.xpath('//a/text()').getall()
Out[4]:
['Name: My image 1 ',
 'Name: My image 2 ',
 'Name: My image 3 ',
 'Name: My image 4 ',
 'Name: My image 5 ']

更简洁的方式查询,Scrapy 提供了两种简写:response.xpath()response.css()

In [5]: response.css('a::text').getall()
In [6]: response.xpath('//a/text()').getall()

Scrapy selectors 是 Selector 类的实例,通过传输 TextResponse 对象或作为 unicode 的补全来构成。
通常不需要手动构造 Scrapy selectors,原因如下:response 对象可以用于 Spider 回调,所以大部分场景下会偏向于使用 response.css()response.xpath() 作为简写。通过使用 response.selectorresponse.xpath() response.css() 可以确保响应体只被解析一次。

todo:这里的 Selector 类 和 Spider 与 response 之间的回调 问题,以后在研究源码的时候着重看看怎么处理的

但是在必要条件下,需要直接使用 Selector ,比如要从如下的内容中构造对象:

>>> from scrapy.selector import Selector
>>> body = 'good'
>>> Selector(text=body).xpath('//span/text()').get()
'good'

Selector 会自动基于输入类型选择最好的解析规则(XML 或 HTML)。

1.2 选择器

接下来先介绍如何使用Scrapy shell(它提供了可交互的测试)
使用方法scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

在 shell 加载完成后,可以通过 response 直接获取响应,通过 response.selector 属性获取选择器

由于该网页返回的是 HTML 内容,所以选择器会自动使用 HTML 解析模式。

为title标签内的文本构造 XPath 访问方式

In [7]: response.xpath('//title/text()')
Out[7]: []

可以看到返回的是一个选择器对象列表,如果想要提取文本内容,需要使用选择器的 .get() 或者 .getall() 方法,如下所示:

In [8]: response.xpath('//title/text()').get()
Out[8]: 'Example website'

.get() 永远只返回一个结果;

如果选择器有多个匹配,那么只返回匹配的第一个内容;
如果只有没有匹配,将返回 None

.getall() 返回一个结果列表

注意 CSS 选择器可以使用 CSS3 的伪元素(pseudoelements)选择文本内容和属性节点。

In [9]: response.css('title::text')
Out[9]: []

In [10]: response.css('title::text').get()
Out[10]: 'Example website'

可以得知,.xpath().css() 方法都会返回一个 SelectorList 实例对象,该实例对象是选择器的列表。

这个接口还可以用于快速选择嵌套的数据:

In [11]: response.css('img').xpath('@src').getall()
Out[11]:
['image1_thumb.jpg',
 'image2_thumb.jpg',
 'image3_thumb.jpg',
 'image4_thumb.jpg',
 'image5_thumb.jpg']

自定义返回结果

如果在获取元素时,没有发现对应的元素,那么将返回 None;但是也可以自定义返回结果:

In [12]: response.css('ab_post').get('no_element')
Out[12]: 'no_element'

css 获取属性值 .attrib

在上面的例子中,获取 src 属性使用了 ‘@src’ XPath,在 CSS 中通过 .attrib 也可以查询该属性。

In [13]: [img.attrib['src'] for img in response.css('img')]
Out[13]:
['image1_thumb.jpg',
 'image2_thumb.jpg',
 'image3_thumb.jpg',
 'image4_thumb.jpg',
 'image5_thumb.jpg']

.attrib 作为简写同样也可以直接获取 SelectorList, 它返回第一个被匹配的元素:

In [14]: response.css('img').attrib['src']
Out[14]: 'image1_thumb.jpg'

这种做法在只需要一个结果时非常有用,比如当根据id或页面上唯一的元素选择时:

In [18]: response.css('base').attrib['href']
Out[18]: 'http://example.com/'

综合用法

获取 base 标签的 href 属性内容

In [18]: response.css('base').attrib['href']
Out[18]: 'http://example.com/'

In [19]: response.xpath('//base/@href').get()
Out[19]: 'http://example.com/'

In [20]: response.css('base::attr(href)').get()
Out[20]: 'http://example.com/'

In [21]: response.css('base').attrib['href']
Out[21]: 'http://example.com/'

获取标签的 href 属性内容(限定内容包含 “image”)

In [24]: response.xpath('//a[contains(@href, "image")]/@href').getall()
Out[24]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

In [25]: response.css('a[href*=image]::attr(href)').getall()
Out[25]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

获取标签 href 内容包含“image”的子标签 src 属性值

In [26]: response.xpath('//a[contains(@href, "image")]/img/@src').getall()
Out[26]:
['image1_thumb.jpg',
 'image2_thumb.jpg',
 'image3_thumb.jpg',
 'image4_thumb.jpg',
 'image5_thumb.jpg']

In [27]: response.css('a[href*=image] img::attr(src)').getall()
Out[27]:
['image1_thumb.jpg',
 'image2_thumb.jpg',
 'image3_thumb.jpg',
 'image4_thumb.jpg',
 'image5_thumb.jpg']

1.3 扩展CSS选择器

根据 W3C 标准,CSS 选择器不能提供选择文本节点或属性值的功能。
但是在网页中抓取内容是非常必要的,Scrapy 为此实现了许多非标准的伪元素。

  • 选择文本节点,使用 ::text
  • 选择属性值,使用 ::attr(name) 这里的 name 属性对应的名称

实例

  • title::text 筛选 </em> 元素的子节点文本</li> <li> <em>*::text</em> 筛选当前选择器上下文的所有子文本节点</li> <li> <em>foo::text</em> 如果 <em>foo</em> 元素存在但是不包含文本,那么返回结果为空。 <ul> <li>这意味着 <em>.css('foo::text').get()</em> 即使元素存在也返回 <em>None</em>,如果需要修改返回值,可以添加 *.get(default='')</li> </ul> </li> <li> <em>a::attr(href)</em> 筛选 <em>href</em> 属性的值</li> </ul> <h2>1.4 嵌套选择器</h2> <p>筛选模式( <em>.xapth()</em> 和 <em>.css()</em> )都返回同一类型选择器的列表,所以你可以对这些筛选列表进行调用,下面是例子:</p> <pre><code class="shell">In [28]: links = response.xpath('//a[contains(@href, "image")]') In [29]: links.getall() Out[29]: ['<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>', '<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>', '<a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>', '<a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>', '<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>'] In [30]: for index, link in enumerate(links): ...: args = (index, link.xpath('@href').get(), link.xpath('img/@src').get()) ...: print('Link numver %d points to url %r and image %r' % args) ...: Link numver 0 points to url 'image1.html' and image 'image1_thumb.jpg' Link numver 1 points to url 'image2.html' and image 'image2_thumb.jpg' Link numver 2 points to url 'image3.html' and image 'image3_thumb.jpg' Link numver 3 points to url 'image4.html' and image 'image4_thumb.jpg' Link numver 4 points to url 'image5.html' and image 'image5_thumb.jpg' </code></pre> <h2>1.5 选择元素属性</h2> <blockquote> <p>有多种方式获取属性的值。</p> </blockquote> <h4>XPath 选择属性</h4> <p>首先,可以使用 XPath 语法:</p> <pre><code class="shell">In [31]: response.xpath('//a/@href').getall() Out[31]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html'] </code></pre> <p>XPath 语法有多种优势:在标准的 XPath 格式中,<em>@attributes</em> 可以作为 XPath 表达式的一部分,等等,可以通过属性值来筛选内容。</p> <h4>CSS 选择属性</h4> <p>Scrapy 也提供了 CSS 选择器的扩展(<em>::attr(...)</em>),它允许这样获得属性值:</p> <pre><code class="shell">In [32]: response.css('a::attr(href)').getall() Out[32]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html'] </code></pre> <h4>Selector attrib 属性</h4> <p>除了这种做法,还有 Selector 的 <em>.attrib</em> 属性。<br> 如果你更希望使用 Python 代码,而不是通过 XPath 或者 CSS 扩展来获取属性,那么这种方式也比较有用:</p> <pre><code class="shell">In [33]: [a.attrib['href'] for a in response.css('a')] Out[33]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html'] </code></pre> <p>这种 python 代码直接读取的方式也可作用于 SelectorList 上;<br> 将会将返回字典,包含第一个匹配元素的属性和值。<br> 如果只需要选择器返回一个结果,那么这么做很方便:</p> <pre><code class="shell">In [34]: response.css('base').attrib Out[34]: {'href': 'http://example.com/'} In [35]: response.css('base').attrib['href'] Out[35]: 'http://example.com/' </code></pre> <h2>1.6 在选择器中使用正则表达式</h2> <p>Selector 类还有 .re() 方法用于提取正则匹配的数据。<br> 然而,不同于 .xpath() 和 .css() 方法,.re() 返回的是一个字符串列表。<br> 所以 .re() 不能做内嵌的 .re() 调用。</p> <blockquote> <p>提取图片名字的例子</p> </blockquote> <pre><code class="shell">In [36]: response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)') Out[36]: ['My image 1 ', 'My image 2 ', 'My image 3 ', 'My image 4 ', 'My image 5 '] In [37]: response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)') Out[37]: 'My image 1 ' </code></pre> <h1>二、XPaths 的使用</h1> <blockquote> <p>在 Scrapy 中高效使用 XPath 的一些建议</p> </blockquote> <blockquote> <p>扩展链接: http://www.zvon.org/comp/r/tut-XPath_1.html<br> 扩展链接2:https://blog.scrapinghub.com/2014/07/17/xpath-tips-from-the-web-scraping-trenches/</p> </blockquote> <h2>2.1 使用 XPath 相对路径</h2> <p>假设你在嵌套选择器中使用 XPath,如果路径以 '/' 开头,那么 Xpath 会指向文档的绝对位置,而不是你现在调用的选择器。</p> <p>比如,如果想提取 <div>元素 中的所有 <a> 元素。</p> <p>首先,获取 <div> 元素,然后遍历 dvi 内容时使用 '//a' 定位元素</p> <pre><code class="shell">In [38]: divs = response.xpath('//div') In [39]: for p in divs.xpath('//a'): ...: print(p.get()) ...: </code></pre> <p>结果返回为空。</p> <p>实际上,第39行代码中的路径,意味着重新以文档起点为基准构建path,而不是在 <div> 元素中构建。</p> <p>可以做这样的修改:</p> <pre><code class="shell">In [56]: for p in divs.xpath('.//a'): ...: print(p) ...: <Selector xpath='.//a' data='<a href="image1.html">Name: My image 1 <'> <Selector xpath='.//a' data='<a href="image2.html">Name: My image 2 <'> <Selector xpath='.//a' data='<a href="image3.html">Name: My image 3 <'> <Selector xpath='.//a' data='<a href="image4.html">Name: My image 4 <'> <Selector xpath='.//a' data='<a href="image5.html">Name: My image 5 <'> </code></pre> <p>更常规的使用方法,直接使用 a 即可:</p> <pre><code class="shell">In [56]: for p in divs.xpath('a'): ...: print(p) ...: </code></pre> <h2>2.2 当通过类 class 查询时,尽量考虑 CSS</h2> <p>由于一个元素可以包含多个 CSS classes,通过 XPath 锁定 class 的方式去选择元素会冗长无比。</p> <p>你需要这样操作 contains(@class, 'someclass') 来弥补多个类的情况。</p> <p>事实证明,Scrapy 选择器允许你使用「链选择器」,所以大多数情况下可以采用:先使用 CSS 筛选class,然后再切换到 XPath 继续筛选。</p> <pre><code class="shell">>>> sel = Selector(text='<div class="hero shout"><time datetime="2014-07-23 19:00">') >>> sel.css('.shout').xpath('./time/@datetime').get() '2014-07-23 19:00' </code></pre> <p>这种灵活使用的「链式筛选」非常实用,别忘了在使用 .xpath() 的时候,路径添加 '.'。</p> <h2>2.3 区别 //node[1] 和 (//node)[1]</h2> <p>//node[1] 返回的是所有父节点下,第一次出现的节点<br> (//node)[1] 返回所有文档匹配节点的第一个,只返回一个值</p> <h2>2.4 在条件中使用文本节点 ❤️</h2> <p>获取文本内容最好选择 XPath https://www.w3.org/TR/xpath/all/#section-String-Functions,而不要使用 .//text() 而选择 '.' 。</p> <p>这是因为 .//text() 表达式会生成一个节点集合,当 节点集合(node-set) 转换成字符串,这个过程经常发生传递参数到字符串函数中,如 conatins() 或 starts_with() 函数,这会导致只会处理第一个元素。</p> <pre><code class="shell">>>> sel = Selector(text='<a href="#">Click here to go to the <strong>Next Page</strong>') >>> sel.xpath('//a//text()').getall() ['Click here to go to the ', 'Next Page'] >>> sel.xpath("string(//a[1]//text())").getall() # convert it to string ['Click here to go to the '] </code></pre> <p>这里只返回了列表中的第一个元素</p> <blockquote> <p>处理方式:将整个节点转换为字符串,这样就会把字内容都加在一起</p> </blockquote> <pre><code class="shell">>>> sel.xpath('//a[1]').getall() ['<a href="#">Click here to go to the <strong>Next Page</strong></a>'] >>> sel.xpath('string(//a[1])').getall() ['Click here to go to the Next Page'] </code></pre> <h3>从子节点中匹配字符串</h3> <p>如:</p> <pre><code class="shell">>>> sel.xpath("//a[contains(.//text(), 'Next Page')]").getall() [] </code></pre> <p>使用 '.' ,情况变得不同</p> <pre><code class="shell">>>> sel.xpath("//a[contains(., 'Next Page')]").getall() ['<a href="#">Click here to go to the <strong>Next Page</strong></a>'] </code></pre> <h2>2.5 XPath 中的表达式</h2> <p>XPath 允许你在 XPath 表达式中引用变量,语法:$somevariable。<br> 这有点类似于参数查询或 SQL 中的查询占位符 '?',意味着你可以预制查询点,再设置值。</p> <h4>举例一:不通过硬编码的方式,通过 id 属性来匹配元素</h4> <pre><code class="shell">In [66]: response.xpath('//div[@id=$val]/a/text()', val='images').get() Out[66]: 'Name: My image 1 ' </code></pre> <h4>举例二:找到包含五个<a>子标签的<div>标签的id值</h4> <pre><code class="shell">In [69]: response.xpath('//div[count(a)=$cnt]/@id', cnt=5).get() Out[69]: 'images' </code></pre> <p>在调用 .xpath() 的时候,必须绑定引用变量的值,否值会抛出 'ValueError: XPath error' 错误。</p> <p>如果想了解更多,这部分内容是以 parsel 库为基础,更多详情和例子在 parse 教程中有介绍</p> <h2>2.6 移除域名</h2> <p>在使用爬虫项目时,经常会使用到「清除域名,只处理元素名」的操作,从而获得更简单/方便的 XPath。<br> 你可以使用 Selector.remove_namespaces() 方法来移除域名。</p> <p>首先,找到一个博客网站用于实践</p> <pre><code>(base) ☁ cherry scrapy shell https://feeds.feedburner.com/PythonInsider </code></pre> <p>如果网页设定了命名空间,一旦我们想要尝试获取某些标签对象,会全部失败,返回None,因为 Atom XML 会混淆这些节点标签。</p> <p>但是如果先调用了 Selector.remove_namespaces() 方法,那么就可以直接获取这些名称。</p> <p>如果你在好奇为什么域名空间移除操作为什么不默认执行,而是采取手动的方式。简单来说有两个原因:</p> <ol> <li>移除域名空间需要遍历和修改文档中所有节点,这意味着在Scrapy对所有文档执行默认抓取操作过程中,不可避免的产生高昂的操作量。</li> <li>预防在某些情况下不需要使用域名空间,尽管这个操作很少见。</li> </ol> <h2>2.7 使用 EXSLT 扩展 ❤️</h2> <p>由于基于 lxml 顶层再封装,所以 Scrapy 也支持一些 EXSLT 扩展。<br> 它可以预注册域名空间从而使用 XPath 表达式。</p> <table> <thead> <tr> <th>预置</th> <th>域名</th> <th>使用方式</th> </tr> </thead> <tbody> <tr> <td>re</td> <td>http://exslt.org/regular-expression</td> <td>http://exslt.org/regexp/index.html</td> </tr> <tr> <td>set</td> <td>http://exsl.org/sets</td> <td>http://exslt.org/set/index.html</td> </tr> </tbody> </table> <h3>2.7.1 正则表达式</h3> <p>在 test() 方法中,可以提供许多 XPath 没法提供的方法</p> <pre><code>doc = u""" <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a></li> </ul> </div> """ >>> sel = Selector(text=doc, type='html') >>> sel.xpath('//li//@href').getall() ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html'] >>> sel.xpath('//li[re:test(@class, "item-\d$")]//@href').getall() ['link1.html', 'link2.html', 'link4.html', 'link5.html'] </code></pre> <blockquote> <p>这里的 li[re:test(@class, "item-\d$')] 使用了正则表达式,这前面的 re() 处理节点文本不同,是处理属性值的正则表达式,而这个功能是 XPath 提供的 contains() 和 start-with() 进阶版本,它可以实现更强的匹配功能。</p> </blockquote> <blockquote> <p>注意 <br> C 语言库的 libxslt 不支持本地 EXSLT 正则表达式,所以 lxml 的功能实现与 Python 的 re 挂钩。尽管如此,在 XPath 中使用正则表达式函数会对性能有影响。</p> </blockquote> <h3>2.7.2 set 操作</h3> <p>set 操作可以在抓取文本前很方便地排除部分文档树内容。</p> <p>比如从某个网站提取微型结构数据:网址(http://schema.org/Product)。只提取 timescopes 和与 itemprops 有关的组。</p> <pre><code class="python">props = scop.xpath('''set:difference(./descendant::*/@itemprop, .//*[@itemscope]/*/@itemprop)''') </code></pre> <h2>2.8 其他的 XPath 扩展</h2> <h3>has-class 扩展</h3> <pre><code class="html"><p class="foo bar-baz">First</p> <p class="foo">Second</p> <p class="bar">Third</p> <p>Fourth</p> </code></pre> <p>可以这么使用</p> <pre><code class="shell">>>> response.xpath('//p[has-class("foo")]') [<Selector xpath='//p[has-class("foo")]' data='<p class="foo bar-baz">First</p>'>, <Selector xpath='//p[has-class("foo")]' data='<p class="foo">Second</p>'>] >>> response.xpath('//p[has-class("foo", "bar-baz")]') [<Selector xpath='//p[has-class("foo", "bar-baz")]' data='<p class="foo bar-baz">First</p>'>] >>> response.xpath('//p[has-class("foo", "bar")]') [] </code></pre> <p>所以 XPath 路径 '//p[has-class("foo", "bar-baz")]' 大致等同于 CSS 路径 'p.foo.bar-baz'。</p> <p>但是记住,XPath 的方式会更慢,因为他是纯 Python 函数,这种方式仅适用于 CSS 选择器无法正常描述的场景。</p> <h3>parsel 的简单扩展</h3> <p>parsel.xpathfuncs.set_xpathfunc(fname, func)</p> <h1>三、引用内建的选择器</h1> <h2>3.1 Selector 选择器对象</h2> <pre><code class="python">class scrapy.selector.Selector(response=None, text=None, type=None, root=None, **kwargs) </code></pre> <p>Selector 对象是选择部分响应内容的包装。</p> <blockquote> <p>response</p> </blockquote> <p>是 HtmlResponse 或 XMLResponse 对象,用于选择和抓取数据</p> <blockquote> <p>text</p> </blockquote> <p>uincode 字符串或utf-8编码的文本,在 response 不可用的情况下替代。不会发生使用 text 或 reponse 。</p> <blockquote> <p>type</p> </blockquote> <p>定义了选择器的类型,可以为 html/xml/None(默认)</p> <ol> <li>如果 type 为 None,那么选择器基于响应,会选择最好的类型解析内容;如果内容为文本,则默认为 html。</li> <li>如果 type 为 None,且传入 response,那么选择器的类型将会按照下面类型推断: <ul> <li>HtmlResponse 对应类型为 html</li> <li>XmlResponse 对应选择器类型为 xml</li> <li>否则选择器类型为 html</li> </ul> </li> <li>如果 type 设定了类型,则不会对内容格式进行检测,强制使用设置的类型。</li> </ol> <blockquote> <p>方法一 xpath</p> </blockquote> <p>xpath(query, namespace=None, **kwargs)</p> <p>寻找匹配 xpath 查询的节点,返回 SelectorList 选择器列表实例,扁平化所有的元素。<br> 元素列表也实现了 Selector 的接口。</p> <ul> <li>query</li> </ul> <p>XPath 查询体,字符串</p> <ul> <li>namaspace<br> 可选项</li> </ul> <p>通过 register_namespace(prefix, uri) 注册后的内容,可以通过 prefis: namespace-uri 的形式使用,不过仅限于当前 Selector 调用。<br> <strong>TODO:这种方式的使用,有一点了解,但是不是很透彻,可待来日解决</strong></p> <p>任何新增的参数名称都可以通过 XPath 表达式传输给 XPath 变量</p> <p><strong>为方便起见,这个方法可以被 response.xpath() 调用</strong></p> <blockquote> <p>方法二 css</p> </blockquote> <p>css(query)</p> <p>应用给定的 CSS 选择器,返回 SelectorList 实例</p> <ul> <li>query</li> </ul> <p>CSS 选择器,字符串格式</p> <p>在后台,CSS 查询会被解析成 XPath,并执行 .xpath() 方法</p> <blockquote> <p>方法三 get</p> </blockquote> <p>get()</p> <p>加载并返回匹配的节点</p> <blockquote> <p>attrib</p> </blockquote> <p>返回基础元素的属性字典</p> <blockquote> <p>re</p> </blockquote> <p>re(regex, replace_entities=True)</p> <p>应用给定的正则表达式,返回匹配的 unicode 字符串列表</p> <ul> <li>regex<br> 可以是编译的正则表达式,字符串会通过 re.compile(regex) 编译。</li> </ul> <p>默认情况下,如 ‘&' 会被直接解析成对应的内容;replace_entities 为 False 则不会做这种改变。</p> <blockquote> <p>re_first</p> </blockquote> <p>re_first(regex, default=None, replace_entities=True)</p> <p>应用给定的正则表达式,返回第一个被匹配的 unicode 字符串。<br> 如果没有匹配,返回默认的值(如果默认值没有提供,则默认为None)</p> <p>另一个可选参数,如上</p> <ul> <li>register_namespace(prefix, uri)<br> 注册给定的域名空间,在当前 Selector 中应用。<br> 没有注册域名空间,你无法从非标准的命名空间中选择或提取数据,具体查看下文 Selector examples on XML response</li> </ul> <blockquote> <p>remove_namespaces()</p> </blockquote> <p>移除所有的域名,允许直接跨过文档获取无域名空间的路径。</p> <blockquote> <p>_<em>bool</em>_()</p> </blockquote> <p>如果没有任何内容,返回 True,否则返回 False。<br> 换句话说,选择器是否有内容</p> <blockquote> <p>getall()</p> </blockquote> <p>加载并返回匹配的所有节点,以 unicode 字符串列表展示。</p> <h2>3.2 选择器列表对象 SelectorList objects</h2> <pre><code class="python">class scrap.selector.SelectorList </code></pre> <p>SelectorList 对象是 list 子类,提供一些额外的方法</p> <blockquote> <p>xpath(xpath, namespaces=None, **kwargs)</p> </blockquote> <p>每个元素都调用 .xpath() 方法,并扁平化返回另一个 SelectorList 对象</p> <ul> <li>query</li> <li>namespace</li> </ul> <blockquote> <p>css(query)</p> </blockquote> <p>为每个元素调用 .css() 方法</p> <ul> <li>query</li> </ul> <blockquote> <p>getall()</p> </blockquote> <p>为每个元素调用 .get() 方法</p> <blockquote> <p>get(default=None)</p> </blockquote> <p>返回第一个元素调用 .get() 的结果。<br> 如果列表为空,则返回默认的结果</p> <blockquote> <p>re(regex, replace_entities=True)</p> </blockquote> <p>为每个元素调用 .re() 方法,扁平化返回列表</p> <blockquote> <p>re_first(regex, default=None, replace_entities=True)</p> </blockquote> <blockquote> <p>attrib</p> </blockquote> <h1>四、例子</h1> <h2>选择 XML 响应</h2> <p>抓取网址:https://support.google.com/merchants/answer/160589?hl=en&ref_topic=2473799</p> <p>提取所有的价格,需要注册一个域名空间:</p> <pre><code class="python">sel = Selector(xml_reponse) # 注册域名空间 sel.regisgter_namespace("g", "http://base.google.com/ns/1.0") sel.xpath("//g:price").getall() </code></pre> <p>[1] https://docs.scrapy.org/en/latest/topics/selectors.html</p> </article>���� </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1495911196547678208"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Python Scrapy 爬虫教程之选择器 Selectors)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1892521045080993792.htm" title="python 自动化数据提取之正则表达式_python 正则提取(2)" target="_blank">python 自动化数据提取之正则表达式_python 正则提取(2)</a> <span class="text-muted">m0_60607245</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>一、Python所有方向的学习路线Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。二、Python必备开发工具工具都帮大家整理好了,安装就可直接上手!三、最新Python学习笔记当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理</div> </li> <li><a href="/article/1892519279048323072.htm" title="GUI编程(window系统→Linux系统)" target="_blank">GUI编程(window系统→Linux系统)</a> <span class="text-muted">诚信爱国敬业友善</span> <a class="tag" taget="_blank" href="/search/%E5%BF%83%E5%BE%97/1.htm">心得</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/gui/1.htm">gui</a> <div>最近有个项目需要将windows系统的程序往Linux系统上面移植,由于之前程序没有考虑过多平台兼容的问题,导致部分功能不可用以下是对近期遇到的问题的总结,以及相应的解决方案和经验分享。1.Python模块安装与管理在Linux系统中,安装和管理Python模块时可能会遇到权限问题或依赖冲突。安装模块:使用pip安装模块时,建议使用--user选项,避免需要管理员权限:bash复制pipinsta</div> </li> <li><a href="/article/1892517514039062528.htm" title="银行排队问题之单队列多窗口服务[天梯赛 -- 栈和队列]" target="_blank">银行排队问题之单队列多窗口服务[天梯赛 -- 栈和队列]</a> <span class="text-muted">苏慕TRYACE</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a> <div>文章目录题目描述思路AC代码题目描述输入样例9020115161210105103301831253123输出样例参考文章思路队列模拟存储结构:使用结构体,存储每一个客户的到达时间和处理时间==(最大为60,大于60的,按60处理)==;用两个数组分别存储每一个窗口的办理人数和该窗口结束上一次处理的时间点具体流程:由于题目给定的顾客顺序是按照时间先后,因此我们顺序处理即可1.依次遍历每一个窗口,用</div> </li> <li><a href="/article/1892516757122379776.htm" title="spring boot基于知识图谱的阿克苏市旅游管理系统python-计算机毕业设计" target="_blank">spring boot基于知识图谱的阿克苏市旅游管理系统python-计算机毕业设计</a> <span class="text-muted">QQ1963288475</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a> <div>目录功能和技术介绍具体实现截图开发核心技术:开发环境开发步骤编译运行核心代码部分展示系统设计详细视频演示可行性论证软件测试源码获取功能和技术介绍该系统基于浏览器的方式进行访问,采用springboot集成快速开发框架,前端使用vue方式,基于es5的语法,开发工具IntelliJIDEAx64,因为该开发工具,内嵌了Tomcat服务运行机制,可不用单独下载Tomcatserver服务器。由于考虑到</div> </li> <li><a href="/article/1892512851331969024.htm" title="Python从0到100(三十九):数据提取之正则(文末免费送书)" target="_blank">Python从0到100(三十九):数据提取之正则(文末免费送书)</a> <span class="text-muted">是Dream呀</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0到100最新</div> </li> <li><a href="/article/1892510076510466048.htm" title="Python学习心得两大编程思想" target="_blank">Python学习心得两大编程思想</a> <span class="text-muted">lifegoesonwjl</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>一、两大编程思想:1.面向过程:功能上的封装典型代表:C语言2.面向对象:属性和行为上的封装典型代表:Python、Java二、面向过程与面向对象的异同点:1.区别:面向过程:事物比较简单,可用线性的思维去解决面向对象:事务比较复杂,使用简单的线性思维无法解决2.共同点:(1)面向过程和面向对象都是解决实际问题的一种思维方式;(2)二者相辅相成,并不是对立的;(3)解决复杂问题,通过面向对象方式便</div> </li> <li><a href="/article/1892509698381377536.htm" title="Linux升级Anacodna并配置jupyterLab" target="_blank">Linux升级Anacodna并配置jupyterLab</a> <span class="text-muted">伪_装</span> <a class="tag" taget="_blank" href="/search/%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/1.htm">环境部署</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/Anaconda/1.htm">Anaconda</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/jupyter/1.htm">jupyter</a> <div>在使用Anaconda的过程中,随着项目和需求的发展,可能需要升级Anaconda的Base环境中的Python版本。本文将详细介绍如何安全地进行升级,包括步骤、代码示例与最终流程图。升级Python一、环境准备在进行任何升级之前,建议先检查当前的Python版本以及各个库的兼容性。我们可以通过以下命令检查当前的Python版本:condainfo你会看到类似以下的输出,其中包含了当前Python</div> </li> <li><a href="/article/1892508940047020032.htm" title="【Linux】删除Conda虚拟环境" target="_blank">【Linux】删除Conda虚拟环境</a> <span class="text-muted">不是伍壹</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/conda/1.htm">conda</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>1、查看当前系统的conda虚拟环境condainfo--envscondaenvlist2、创建虚拟的环境condacreate-n(你的环境名字)python=(你需要的版本号,如(3.7,3.8,3.10))3、查看安装了哪些包condalist4、删除虚拟环境condaremove-nname--all5、删除虚拟环境中的包condaremove--name$(需要删除的环境名字)$(需要</div> </li> <li><a href="/article/1892505537497591808.htm" title="动态规划之背包问题--python版本" target="_blank">动态规划之背包问题--python版本</a> <span class="text-muted">我是小码搬运工</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/python%E5%9F%BA%E7%A1%80/1.htm">python基础</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/1.htm">动态规划</a><a class="tag" taget="_blank" href="/search/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/1.htm">背包问题</a><a class="tag" taget="_blank" href="/search/python%E7%89%88%E6%9C%AC/1.htm">python版本</a> <div>动态规划之背包问题–python版本问题已知一个最大量的背包,给定一组给定固定价值和固定体积的物品,求在不超过最大值的前提下,能放入背包中的最大总价值。解题思路该问题是典型的动态规划问题,分为三种不同的类型(0-1背包问题、完全背包和多重背包问题)解题关键–状态转移表达式:B(k,C)=max(B(k−1,C),B(k−1,C−ci)+vi)B(k,C)=max(B(k-1,C),B(k-1,C-</div> </li> <li><a href="/article/1892503900355883008.htm" title="动态规划之背包问题全解" target="_blank">动态规划之背包问题全解</a> <span class="text-muted">学会了,不,学废了</span> <a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/1.htm">动态规划</a> <div>概述———动态规划提出人:理查德·贝尔曼本质:一张表格处理方法内容:把原问题分解为若干子问题,自底向上先求解最小子问题,把结果储存在表格中,求解大的子问题时直接从表格中查询小的子问题的解,以避免重复计算,从而提高效率。一、动态规划求解原理适用范围:问题需要具备3个性质———最优子结构、子问题重叠、无后效性。最优子结构指问题最优解包含其子问题的最优解,是使用动态规划的基本条件。三要素:状态、阶段、决</div> </li> <li><a href="/article/1892503018272780288.htm" title="ArcGIS二次开发之WPF中控件的使用" target="_blank">ArcGIS二次开发之WPF中控件的使用</a> <span class="text-muted">ShirmyMao</span> <a class="tag" taget="_blank" href="/search/ArcGIS%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/1.htm">ArcGIS二次开发</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/arcgis/1.htm">arcgis</a> <div>WPF中ArcGIS控件的使用WPF中插入ArcGIS控件Winform控件上嵌套使用WPF控件WPF中插入ArcGIS控件在WPF中引用ArcGIS的控件需要使用WindowsFromsHost,具体用法如下:添加引用:WindowsFormsIntegration和system.windows.formWpf.xaml中后台代码中:publicAxMapControlMapControl=ne</div> </li> <li><a href="/article/1892501862800748544.htm" title="Centos7 搭建 Jupyter + Nginx 服务" target="_blank">Centos7 搭建 Jupyter + Nginx 服务</a> <span class="text-muted">某龙兄</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>JupyterNotebook(此前被称为IPythonnotebook)是一个交互式笔记本,支持运行40多种编程语言。JupyterNotebook的本质是一个Web应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和markdown。用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。本文讲述如何搭建Jupyter+Nginx服务,仅供学习与交流,请勿用于商业用途一</div> </li> <li><a href="/article/1892499970943152128.htm" title="DeepSeek 赋能工业软件之全流程方案" target="_blank">DeepSeek 赋能工业软件之全流程方案</a> <span class="text-muted">爱吃青菜的大力水手</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a><a class="tag" taget="_blank" href="/search/%E6%8C%81%E7%BB%AD%E9%83%A8%E7%BD%B2/1.htm">持续部署</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a> <div>deepseek赋能工业软件之全流程方案之侧重半导体FABdeepseek在工业软件中的应用场景“deepseek”大模型在工业软件领域拥有广泛的应用场景,包括以下几个方面:智能调度:利用深度学习和优化算法,根据实时数据动态调整生产计划和资源分配。它可以综合考虑订单需求、设备状态和产能限制,智能生成最优的生产排程方案,减少等待时间和切换成本。例如在汽车制造工厂,deepseek可根据订单需求和设备</div> </li> <li><a href="/article/1892498961952993280.htm" title="动态规划之背包问题的Python实现" target="_blank">动态规划之背包问题的Python实现</a> <span class="text-muted">名侦探debug</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E6%B1%82%E8%A7%A3/1.htm">动态规划求解</a> <div>目录1.问题描述2.动态规划之网格法3.python实现1.问题描述题目来源于《算法图解》第9章练习题9.2,如下图所示。对于背包问题,通常的做法有列举法、贪婪算法和动态规划(1)列举法:列举出所有的可能情况,再选择最优解,但当情况很多时,这种算法复杂度很高(2)贪婪算法:在容量允许范围内,每次都拿剩余物品中价值最高的,贪婪算法能够快速解决复杂度很高的问题,但通常得到的是次优解,但就对这个题目而言</div> </li> <li><a href="/article/1892498835721220096.htm" title="探索单片机世界的音乐之旅 —— 51单片机简易电子琴项目解析" target="_blank">探索单片机世界的音乐之旅 —— 51单片机简易电子琴项目解析</a> <span class="text-muted">蔡松宽</span> <div>探索单片机世界的音乐之旅——51单片机简易电子琴项目解析电子琴.rar项目地址:https://gitcode.com/open-source-toolkit/67c65项目概况:旋律与科技的融合在浩瀚的电子海洋里,51单片机始终是那座引领初学者进入嵌入式开发殿堂的桥梁。51单片机实战之简易电子琴项目,正是专为此而生的一盏明灯。它不仅是技术实践的绝佳示例,更是每一位电子爱好者发掘硬件音乐潜能的钥匙</div> </li> <li><a href="/article/1892497197967142912.htm" title="总结10个Python赚钱的接单平台 兼职月入5000+" target="_blank">总结10个Python赚钱的接单平台 兼职月入5000+</a> <span class="text-muted">begefefsef</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>前言“如果说当下什么编程语言最靠谱或者比较适合搞副业?”答案肯定100%是:Pythonpython是所有语法中最简单易上手的语言,不需要特别的的英语词汇量,逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据,制作各种图表,提升工作效率。而且还能利用业余时间接点私活,一个月轻松收入过万不是问题,这样的生活他不香吗?今天就给大家盘点几个基本入门接私活的资源,让你轻松学python,</div> </li> <li><a href="/article/1892495181991702528.htm" title="大学生学完python靠几个接单网站兼职,实现经济独立" target="_blank">大学生学完python靠几个接单网站兼职,实现经济独立</a> <span class="text-muted">「已注销」</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>大学生学完python靠几个接单网站兼职,实现经济独立程序员就是当今时代的手艺人,程序员可以通过个人的技术来谋生。而在工作之余接私单可以作为一种创富的途径,受到程序员的广泛认可。说句实在话,现在这个时代,很多人仅靠主业顶多维持基本生活,想让自己、家人生活好一点很难。我接的私活并不算多,加起来也就几万左右,只能算一半,我想把一些经验分享出来,毕竟现在生活都不容易,能赚一点是一点。一、程序员接活、新手</div> </li> <li><a href="/article/1892488879328522240.htm" title="动态规划之背包问题" target="_blank">动态规划之背包问题</a> <span class="text-muted">于冬恋</span> <a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/1.htm">动态规划</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>动态规划是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。目录01背包问题完全背包问题多重背包问题二维费用背包问题(1)01背包问题给定n个物体,和一个容量为c的背包,物品i的重量为wi,其价值为应该如何选择装入背包的物品使其获得的总价值最大。可以用贪心算法,但是不一定能达到最优解,所以用动态规划解决创建一个数组dp[i][j]i</div> </li> <li><a href="/article/1892487240139993088.htm" title="Python wifi 安装手机app" target="_blank">Python wifi 安装手机app</a> <span class="text-muted">yichengace</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目的当测试机数量越来越多时,测试包的安装会成为一个问题,用wifi安装来解决这个问题,并且用脚本语言来批量控制思路思路就是py调用pc端的adb命令,向手机发送请求,无线是因为,如果未来测试机越来越多,一台电脑的usb接口数量肯定不够准备工具python,adb,pycharm,测试用app,这里选择qq(https://qd.myapp.com/myapp/qqteam/AndroidQQ/mo</div> </li> <li><a href="/article/1892485474463838208.htm" title="深度学习之目标检测的常用标注工具" target="_blank">深度学习之目标检测的常用标注工具</a> <span class="text-muted">铭瑾熙</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E8%B7%9F%E8%B8%AA/1.htm">目标跟踪</a> <div>1LabelImgLabelImg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用Python编写的,并使用Qt作为其图形界面,简单好用。注释以PASCALVOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持COCO数据集格式。2labelmelabelme是一款开源的图像/视频标注工具,标签可用于目标检测、分割和分类。灵感是来自于MIT开源的一款标注工具Label</div> </li> <li><a href="/article/1892483583331856384.htm" title="Python 舆论风向分析爬虫:全流程数据获取、清洗与情感剖析" target="_blank">Python 舆论风向分析爬虫:全流程数据获取、清洗与情感剖析</a> <span class="text-muted">西攻城狮北</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B/1.htm">实战案例</a> <div>引言在当今信息爆炸的时代,互联网上充斥着海量的用户言论和观点。了解舆论风向对于企业、政府机构以及研究者等具有重要的意义,可以帮助他们及时把握公众情绪、调整策略与决策。Python作为一种强大的编程语言,在数据爬取与分析方面具有得天独厚的优势,能够助力我们高效地实现舆情监测与深入剖析。一、环境搭建与目标确定1.环境搭建为了顺利完成爬虫与数据分析任务,首先需要确保你的开发环境已经安装了以下Python</div> </li> <li><a href="/article/1892480051669168128.htm" title="PyCharm 集成 DeepSeek:本地运行 or API 直连?打造你的 AI 编程神器!" target="_blank">PyCharm 集成 DeepSeek:本地运行 or API 直连?打造你的 AI 编程神器!</a> <span class="text-muted">AI云极</span> <a class="tag" taget="_blank" href="/search/%E3%80%90AI%E6%99%BA%E8%83%BD%E7%B3%BB%E5%88%97%E3%80%91/1.htm">【AI智能系列】</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a><a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a> <div>在AI赋能编程的时代,如何让AI辅助写代码,提升开发效率?DeepSeek作为一款开源、强大、免费的AI编程助手,结合PyCharm,能够大幅提升Python编程体验。今天,我们就来详细讲解如何在PyCharm中接入DeepSeek,无论你想使用本地部署的DeepSeek,还是官方API版本,都能轻松实现!为什么选择DeepSeek+PyCharm?DeepSeekR1采用6710亿参数的MoE(</div> </li> <li><a href="/article/1892480052910682112.htm" title="Python3.5源码分析-sys模块及site模块导入" target="_blank">Python3.5源码分析-sys模块及site模块导入</a> <span class="text-muted">小屋子大侠</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Python%E5%88%86%E6%9E%90/1.htm">Python分析</a><a class="tag" taget="_blank" href="/search/python%E6%BA%90%E7%A0%81/1.htm">python源码</a> <div>Python3源码分析本文环境python3.5.2。参考书籍>python官网Python3的sys模块初始化根据分析完成builtins初始化后,继续分析sys模块的初始化,继续分析_Py_InitializeEx_Private函数的执行,void_Py_InitializeEx_Private(intinstall_sigs,intinstall_importlib){...sysmod=</div> </li> <li><a href="/article/1892476394009587712.htm" title="【CUDA】Pytorch_Extensions" target="_blank">【CUDA】Pytorch_Extensions</a> <span class="text-muted">joker D888</span> <a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/cuda/1.htm">cuda</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a> <div>【CUDA】Pytorch_Extensions为什么要开发CUDA扩展?当我们在PyTorch中实现自定义算子时,通常有两种选择:使用纯Python实现(简单但效率低)使用C++/CUDA扩展(高效但需要编译)对于计算密集型的操作(如神经网络中的自定义激活函数),使用CUDA扩展可以获得接近硬件极限的性能。本文将以实现一个多项式激活函数x²+x+1为例,展示完整的开发流程。完整CUDA扩展代码解</div> </li> <li><a href="/article/1892475006722568192.htm" title="Labelbox:引领AI与人类协作的未来" target="_blank">Labelbox:引领AI与人类协作的未来</a> <span class="text-muted">魏兴雄Milburn</span> <div>Labelbox:引领AI与人类协作的未来labelbox-pythonLabelboxPythonClient项目地址:https://gitcode.com/gh_mirrors/la/labelbox-python项目介绍Labelbox是一款专为企业和学术研究社区设计的开源工具,旨在简化数据标注、生成高质量的人类反馈数据、评估和提升模型性能,并通过无缝结合AI与人类工作流程来自动化任务。无</div> </li> <li><a href="/article/1892474123800604672.htm" title="基于python使用scanpy分析单细胞转录组数据" target="_blank">基于python使用scanpy分析单细胞转录组数据</a> <span class="text-muted">探序基因</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%BB%86%E8%83%9E%E5%88%86%E6%9E%90/1.htm">单细胞分析</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>探序基因肿瘤研究院整理相关后缀的格式介绍:.h5ad:是一种用于存储单细胞数据的文件格式,可以通过anndata库在Python中处理.loom:高效的数据存储格式(.loom文件),使得用户可以轻松地存储、查询和分析大规模的单细胞数据集。Loompy的设计目标是提供一个快速、灵活且易于使用的工具,以支持生物信息学家和研究人员在单细胞水平上进行数据分析。python的单细胞转录组数据结构说明:da</div> </li> <li><a href="/article/1892473239033147392.htm" title="本地搭建小型 DeepSeek 并进行微调" target="_blank">本地搭建小型 DeepSeek 并进行微调</a> <span class="text-muted">非著名架构师</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E6%96%87%E6%A1%A3/1.htm">知识文档</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E7%A1%AC%E4%BB%B6/1.htm">智能硬件</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a> <div>本文将指导您在本地搭建一个小型的DeepSeek模型,并进行微调,以处理您的特定数据。1.环境准备Python3.7或更高版本PyTorch1.8或更高版本CUDA(可选,用于GPU加速)Git2.克隆DeepSeek仓库bash复制gitclonehttps://github.com/deepseek-ai/deepseek.gitcddeepseek3.安装依赖bash复制pipinstall</div> </li> <li><a href="/article/1892468193570648064.htm" title="使用Python和OpenCV实现图像像素压缩与解压" target="_blank">使用Python和OpenCV实现图像像素压缩与解压</a> <span class="text-muted">东方佑</span> <a class="tag" taget="_blank" href="/search/%E9%87%8F%E5%AD%90%E5%8F%98%E6%B3%95/1.htm">量子变法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在本文中,我们将探讨如何使用Python和OpenCV库来实现一种简单的图像像素压缩算法。我们将详细讨论代码的工作原理,并提供一个具体的示例来演示该过程。1.引言随着数字媒体的普及,图像处理成为了一个重要的领域。无论是为了减少存储空间还是加快网络传输速度,图像压缩技术都扮演着至关重要的角色。这里,我们提出了一种基于像素重复模式的简单压缩算法,它适用于具有大量连续相同像素值的图像。2.技术栈介绍2.</div> </li> <li><a href="/article/1892468067355652096.htm" title="【Python系列】Python 解释器的站点配置" target="_blank">【Python系列】Python 解释器的站点配置</a> <span class="text-muted">Kwan的解忧杂货铺@新空间代码工作室</span> <a class="tag" taget="_blank" href="/search/s1/1.htm">s1</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kwan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kafka,Spring,微服务,Netty等常用开发工具系列:罗列常用的开发工具,如IDEA,M</div> </li> <li><a href="/article/1892466301994070016.htm" title="安装与部署openeuler 的HA" target="_blank">安装与部署openeuler 的HA</a> <span class="text-muted">VX-IT BANG</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>实现原理LinuxHA(HighAvailability,高可用性)是指利用Linux操作系统构建的高可用集群解决方案,旨在确保关键业务服务在面临硬件故障、软件错误、网络中断等各种异常情况时,依然能够持续、稳定地运行,尽量减少服务中断时间,提高系统的可靠性和可用性。以下从几个方面详细介绍:关键组件和技术心跳监测(Heartbeat)这是LinuxHA系统中最基础也是最重要的组件之一。它通过在节点之</div> </li> <li><a href="/article/96.htm" title="怎么样才能成为专业的程序员?" target="_blank">怎么样才能成为专业的程序员?</a> <span class="text-muted">cocos2d-x小菜</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div>  如何要想成为一名专业的程序员?仅仅会写代码是不够的。从团队合作去解决问题到版本控制,你还得具备其他关键技能的工具包。当我们询问相关的专业开发人员,那些必备的关键技能都是什么的时候,下面是我们了解到的情况。   关于如何学习代码,各种声音很多,然后很多人就被误导为成为专业开发人员懂得一门编程语言就够了?!呵呵,就像其他工作一样,光会一个技能那是远远不够的。如果你想要成为</div> </li> <li><a href="/article/223.htm" title="java web开发 高并发处理" target="_blank">java web开发 高并发处理</a> <span class="text-muted">BreakingBad</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/%E5%A4%84%E7%90%86/1.htm">处理</a><a class="tag" taget="_blank" href="/search/%E9%AB%98/1.htm">高</a> <div>java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S(</div> </li> <li><a href="/article/350.htm" title="mysql批量更新" target="_blank">mysql批量更新</a> <span class="text-muted">ekian</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>mysql更新优化: 一版的更新的话都是采用update set的方式,但是如果需要批量更新的话,只能for循环的执行更新。或者采用executeBatch的方式,执行更新。无论哪种方式,性能都不见得多好。 三千多条的更新,需要3分多钟。 查询了批量更新的优化,有说replace into的方式,即: replace into tableName(id,status) values</div> </li> <li><a href="/article/477.htm" title="微软BI(3)" target="_blank">微软BI(3)</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E8%BD%AFBI+SSIS/1.htm">微软BI SSIS</a> <div>1) Q:该列违反了完整性约束错误;已获得 OLE DB 记录。源:“Microsoft SQL Server Native Client 11.0” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 'FZCHID',表 'JRB_EnterpriseCredit.dbo.QYFZCH';列不允许有 Null 值。INSERT 失败。”。 A:一般这类问题的存在是 </div> </li> <li><a href="/article/604.htm" title="Java中的List" target="_blank">Java中的List</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>        List是一个有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。         与 set 不同,列表通常允许重复</div> </li> <li><a href="/article/731.htm" title="读书笔记" target="_blank">读书笔记</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>   1.  K是一家加工厂,需要采购原材料,有A,B,C,D 4家供应商,其中A给出的价格最低,性价比最高,那么假如你是这家企业的采购经理,你会如何决策?          传统决策: A:100%订单  B,C,D:0%     &nbs</div> </li> <li><a href="/article/858.htm" title="centos 安装 Codeblocks" target="_blank">centos 安装 Codeblocks</a> <span class="text-muted">随便小屋</span> <a class="tag" taget="_blank" href="/search/codeblocks/1.htm">codeblocks</a> <div>1.安装gcc,需要c和c++两部分,默认安装下,CentOS不安装编译器的,在终端输入以下命令即可yum install gccyum install gcc-c++   2.安装gtk2-devel,因为默认已经安装了正式产品需要的支持库,但是没有安装开发所需要的文档.yum install gtk2* 3. 安装wxGTK    yum search w</div> </li> <li><a href="/article/985.htm" title="23种设计模式的形象比喻" target="_blank">23种设计模式的形象比喻</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>1、ABSTRACT FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory   工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:</div> </li> <li><a href="/article/1112.htm" title="开发管理 CheckLists" target="_blank">开发管理 CheckLists</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E7%AE%A1%E7%90%86+CheckLists/1.htm">开发管理 CheckLists</a> <div>开发管理 CheckLists(23) -使项目组度过完整的生命周期 开发管理 CheckLists(22) -组织项目资源 开发管理 CheckLists(21) -控制项目的范围开发管理 CheckLists(20) -项目利益相关者责任开发管理 CheckLists(19) -选择合适的团队成员开发管理 CheckLists(18) -敏捷开发 Scrum Master 工作开发管理 C</div> </li> <li><a href="/article/1239.htm" title="js实现切换" target="_blank">js实现切换</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%A0%8F%E7%9B%AE%E5%88%87%E6%8D%A2/1.htm">栏目切换</a> <div>js主要功能之一就是实现页面的特效,窗体的切换可以减少页面的大小,被门户网站大量应用思路: 1,先将要显示的设置为display:bisible 否则设为none 2,设置栏目的id ,js获取栏目的id,如果id为Null就设置为显示 3,判断js获取的id名字;再设置是否显示   代码实现:   html代码: <di</div> </li> <li><a href="/article/1366.htm" title="周鸿祎在360新员工入职培训上的讲话" target="_blank">周鸿祎在360新员工入职培训上的讲话</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%84%9F%E6%82%9F/1.htm">感悟</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA/1.htm">职场</a> <div>        这篇文章也是最近偶尔看到的,考虑到原博客发布者可能将其删除等原因,也更方便个人查找,特将原文拷贝再发布的。“学东西是为自己的,不要整天以混的姿态来跟公司博弈,就算是混,我觉得你要是能在混的时间里,收获一些别的有利于人生发展的东西,也是不错的,看你怎么把握了”,看了之后,对这句话记忆犹新。  &</div> </li> <li><a href="/article/1493.htm" title="前端Web开发的页面效果" target="_blank">前端Web开发的页面效果</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Microsoft/1.htm">Microsoft</a> <div>1.IE6下png图片的透明显示: <img src="图片地址" border="0" style="Filter.Alpha(Opacity)=数值(100),style=数值(3)"/> 或在<head></head>间加一段JS代码让透明png图片正常显示。 2.<li>标</div> </li> <li><a href="/article/1620.htm" title="【JVM五】老年代垃圾回收:并发标记清理GC(CMS GC)" target="_blank">【JVM五】老年代垃圾回收:并发标记清理GC(CMS GC)</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/1.htm">垃圾回收</a> <div>  CMS概述 并发标记清理垃圾回收(Concurrent Mark and Sweep GC)算法的主要目标是在GC过程中,减少暂停用户线程的次数以及在不得不暂停用户线程的请夸功能,尽可能短的暂停用户线程的时间。这对于交互式应用,比如web应用来说,是非常重要的。   CMS垃圾回收针对新生代和老年代采用不同的策略。相比同吞吐量垃圾回收,它要复杂的多。吞吐量垃圾回收在执</div> </li> <li><a href="/article/1747.htm" title="Struts2技术总结" target="_blank">Struts2技术总结</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/struts2/1.htm">struts2</a> <div>  必备jar文件 早在struts2.0.*的时候,struts2的必备jar包需要如下几个: commons-logging-*.jar   Apache旗下commons项目的log日志包 freemarker-*.jar          </div> </li> <li><a href="/article/1874.htm" title="Jquery easyui layout应用注意事项" target="_blank">Jquery easyui layout应用注意事项</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/layout/1.htm">layout</a> <div>在jquery easyui中提供了easyui-layout布局,他的布局比较局限,类似java中GUI的border布局。下面对其使用注意事项作简要介绍:      如果在现有的工程中前台界面均应用了jquery easyui,那么在布局的时候最好应用jquery eaysui的layout布局,否则在表单页面(编辑、查看、添加等等)在不同的浏览器会出</div> </li> <li><a href="/article/2001.htm" title="java-拷贝特殊链表:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?" target="_blank">java-拷贝特殊链表:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class CopySpecialLinkedList { /** * 题目:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表? 拷贝pNext指针非常容易,所以题目的难点是如何拷贝pRand指针。 假设原来链表为A1 -> A2 ->... -> An,新拷贝</div> </li> <li><a href="/article/2128.htm" title="color" target="_blank">color</a> <span class="text-muted">Chen.H</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">    <HTML>    <HEAD>&nbs</div> </li> <li><a href="/article/2255.htm" title="[信息与战争]移动通讯与网络" target="_blank">[信息与战争]移动通讯与网络</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>      两个坚持:手机的电池必须可以取下来                光纤不能够入户,只能够到楼宇       建议大家找这本书看看:<&</div> </li> <li><a href="/article/2382.htm" title="oracle flashback query(闪回查询)" target="_blank">oracle flashback query(闪回查询)</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/flashback+query/1.htm">flashback query</a><a class="tag" taget="_blank" href="/search/flashback+table/1.htm">flashback table</a> <div>在Oracle 10g中,Flash back家族分为以下成员: Flashback Database Flashback Drop Flashback Table Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query) 下面介绍一下Flashback Drop 和Flas</div> </li> <li><a href="/article/2509.htm" title="zeus持久层DAO单元测试" target="_blank">zeus持久层DAO单元测试</a> <span class="text-muted">deng520159</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>zeus代码测试正紧张进行中,但由于工作比较忙,但速度比较慢.现在已经完成读写分离单元测试了,现在把几种情况单元测试的例子发出来,希望有人能进出意见,让它走下去. 本文是zeus的dao单元测试: 1.单元测试直接上代码   package com.dengliang.zeus.webdemo.test; import org.junit.Test; import o</div> </li> <li><a href="/article/2636.htm" title="C语言学习三printf函数和scanf函数学习" target="_blank">C语言学习三printf函数和scanf函数学习</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/printf/1.htm">printf</a><a class="tag" taget="_blank" href="/search/scanf/1.htm">scanf</a><a class="tag" taget="_blank" href="/search/language/1.htm">language</a> <div>printf函数 /* 2013年3月10日20:42:32 地点:北京潘家园 功能: 目的: 测试%x %X %#x %#X的用法 */ # include <stdio.h> int main(void) { printf("哈哈!\n"); // \n表示换行 int i = 10; printf</div> </li> <li><a href="/article/2763.htm" title="那你为什么小时候不好好读书?" target="_blank">那你为什么小时候不好好读书?</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/life/1.htm">life</a> <div>dady, 我今天捡到了十块钱, 不过我还给那个人了 good girl! 那个人有没有和你讲thank you啊 没有啦....他拉我的耳朵我才把钱还给他的, 他哪里会和我讲thank you   爸爸, 如果地上有一张5块一张10块你拿哪一张呢.... 当然是拿十块的咯... 爸爸你很笨的, 你不会两张都拿   爸爸为什么上个月那个人来跟你讨钱, 你告诉他没</div> </li> <li><a href="/article/2890.htm" title="iptables开放端口" target="_blank">iptables开放端口</a> <span class="text-muted">Fanyucai</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/iptables/1.htm">iptables</a><a class="tag" taget="_blank" href="/search/%E7%AB%AF%E5%8F%A3/1.htm">端口</a> <div>1,找到配置文件 vi /etc/sysconfig/iptables   2,添加端口开放,增加一行,开放18081端口 -A INPUT -m state --state NEW -m tcp -p tcp --dport 18081 -j ACCEPT   3,保存 ESC :wq!   4,重启服务 service iptables </div> </li> <li><a href="/article/3017.htm" title="Ehcache(05)——缓存的查询" target="_blank">Ehcache(05)——缓存的查询</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F/1.htm">排序</a><a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/%E7%BB%9F%E8%AE%A1/1.htm">统计</a><a class="tag" taget="_blank" href="/search/query/1.htm">query</a> <div>缓存的查询 目录 1.    使Cache可查询 1.1     基于Xml配置 1.2     基于代码的配置 2     指定可搜索的属性 2.1     可查询属性类型 2.2 &</div> </li> <li><a href="/article/3144.htm" title="通过hashset找到数组中重复的元素" target="_blank">通过hashset找到数组中重复的元素</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/hashset/1.htm">hashset</a> <div>  如何在hashset中快速找到重复的元素呢?方法很多,下面是其中一个办法: int[] array = {1,1,2,3,4,5,6,7,8,8}; Set<Integer> set = new HashSet<Integer>(); for(int i = 0</div> </li> <li><a href="/article/3271.htm" title="使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL" target="_blank">使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL</a> <span class="text-muted">lanrikey</span> <a class="tag" taget="_blank" href="/search/history/1.htm">history</a> <div>后退时关闭当前页面 <script type="text/javascript"> jQuery(document).ready(function ($) {         if (window.history && window.history.pushState) {</div> </li> <li><a href="/article/3398.htm" title="应用程序的通信成本" target="_blank">应用程序的通信成本</a> <span class="text-muted">netkiller.github.com</span> <a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E9%99%88%E6%99%AF%E5%B3%B0/1.htm">陈景峰</a><a class="tag" taget="_blank" href="/search/netkiller/1.htm">netkiller</a><a class="tag" taget="_blank" href="/search/neo/1.htm">neo</a> <div>应用程序的通信成本 什么是通信 一个程序中两个以上功能相互传递信号或数据叫做通信。 什么是成本 这是是指时间成本与空间成本。 时间就是传递数据所花费的时间。空间是指传递过程耗费容量大小。 都有哪些通信方式 全局变量 线程间通信 共享内存 共享文件 管道 Socket 硬件(串口,USB) 等等 全局变量 全局变量是成本最低通信方法,通过设置</div> </li> <li><a href="/article/3525.htm" title="一维数组与二维数组的声明与定义" target="_blank">一维数组与二维数组的声明与定义</a> <span class="text-muted">恋洁e生</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">一维数组</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E4%B9%89/1.htm">定义</a><a class="tag" taget="_blank" href="/search/%E5%A3%B0%E6%98%8E/1.htm">声明</a><a class="tag" taget="_blank" href="/search/%E5%88%9D%E5%A7%8B%E5%8C%96/1.htm">初始化</a> <div>/**  *  */ package test20111005; /**  * @author FlyingFire  * @date:2011-11-18 上午04:33:36  * @author :代码整理  * @introduce :一维数组与二维数组的初始化  *summary:  */ public c</div> </li> <li><a href="/article/3652.htm" title="Spring Mybatis独立事务配置" target="_blank">Spring Mybatis独立事务配置</a> <span class="text-muted">toknowme</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>在项目中有很多地方会使用到独立事务,下面以获取主键为例   (1)修改配置文件spring-mybatis.xml  <!-- 开启事务支持 -->  <tx:annotation-driven transaction-manager="transactionManager" />   &n</div> </li> <li><a href="/article/3779.htm" title="更新Anadroid SDK Tooks之后,Eclipse提示No update were found" target="_blank">更新Anadroid SDK Tooks之后,Eclipse提示No update were found</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a> <div>使用Android SDK Manager 更新了Anadroid SDK Tooks 之后, 打开eclipse提示 This Android SDK requires Android Developer Toolkit version 23.0.0 or above, 点击Check for Updates  检测一会后提示 No update were found  </div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>