python BeautifulSoup获取a标签问题

python BeautifulSoup获取a标签问题,第1张

# encoding: UTF-8

#请自行下载lxml库

from lxmlhtml import fromstring #伟大无敌的lxml库

class_name="row" #先找到class=row的所有DOM对象

dxpath="/td[1]/a" #再根据xpath找到对应的 a 标签

f=open("1TXT") #读取你的测试文档

a=fread()

fclose()

dom = fromstring(a)

b = domfind_class(class_name) #找到所有class=row的对象

print len(b)

if len(b):

for b1 in b:

ddd=b1xpath(dxpath)

if len(ddd):

for ddd1 in ddd:

print ddd1get("href")

在Jmeter中,除了正则表达式可以用作关联,还有一种方式也可以做关联,那就是 XPath Extractor。它是利用xpath提取出关键信息,传递变量。

具体用法

添加一个后置处理器- XPath Extractor

实际 *** 作

以腾讯新闻网为例,我们做一次演练。对腾讯新闻网我们发起一次请求,观察结果。

现在我想利用xpath把这些url都取出来,我们来写一个xpath表达式匹配一下。发现url都被匹配出来了。

//a[@class='linkto']/@href 具体是什么意思呢?意思就是通过a>class>href这三层标签进行逐级检索,找到class=linkto标签下的所有href,进行匹配

这里如果我想匹配到href标签下的文字标题怎么办?改一下表达式吧-- //a[@class='linkto'], 我们发现取出来都是标题,后面可以再进行拼接

现在表达式没有问题了,我们将添加的xpath提取器挂在>

在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxmlhtml的xpath对html进行分析,获取抓取信息。

首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上被推荐的python binding是lxml,也有beautifulsoup,不嫌麻烦的话还可以自己用正则表达式去构建,本文以lxml为例讲解。

假设有如下的HTML文档:

1 <html>

2 <body>

3 <form>

4 <div id='leftmenu'>

5 <h3>text</h3>

6 <ul id=’china’><!-- first location -->

7 <li></li>

8 <li></li>

9

10 </ul>

11 <ul id=’england’><!-- second location-->

12 <li></li>

13 <li></li>

14

15 </ul>

16 </div>

17 </form>

18 </body>

19 </html>

直接使用lxml处理:

1 import codecs

2 from lxml import etree

3 f=codecsopen("ceshihtml","r","utf-8")

4 content=fread()

5 fclose()

6 tree=etreeHTML(content)

etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了,是不是有点小激动,现在就尝试下吧。

在使用xpath之前我们先来看看作为对照的jQuery和RE。

在jQuery里要处理这种东西就很简单,特别是假如那个ul节点有id的话(比如是<ul id=’china’>):

$("#china")each(function(){});

具体到此处是:

$("#leftmenu")children("h3:contains('text')")next("ul")each(function(){});

找到id为leftmenu的节点,在其下找到一个内容包含为”text”的h3节点,再取其接下来的一个ul节点。

在python里要是用RE来处理就略麻烦一些:

block_pattern=recompile(u"<h3>档案</h3>()<h3>", reI | reS)

m=block_patternfindall(content)

item_pattern=recompile(u"<li>()</li>", reI | reS)

items=item_patternfindall(m[0])

for i in items:

print i

那么用xpath要怎么做呢?其实跟jQuery是差不多的:

nodes=treexpath("/descendant::ul[@id='china']")

当然,现在没有id的话也就只能用类似于jQuery的方法了。完整的xpath应该是这样写的(注意,原文件中的TAG有大小写的情况,但是在XPATH里只能用小写):

nodes=treexpath(u"/html/body/form/div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")

更简单的方法就是像jQuery那样直接根据id定位:

nodes=treexpath(u"//div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")

这两种方法返回的结果中,nodes[0]就是那个“text”的h3节点后面紧跟的第一个ul节点,这样就可以列出后面所有的ul节点内容了。

如果ul节点下面还有其他的节点,我们要找到更深节点的内容,如下的循环就是把这些节点的文本内容列出:

nodes=nodes[0]xpath("li/a")

for n in nodes:

print ntext

对比三种方法应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而RE则纯粹是基于plain text。RE对付简单的页面是没有问题,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的RE pattern可能会远比写一个xpath要复杂。特别是目前主流的基于CSS的页面设计方式,其中大部分关键节点都会有id――对于使用jQuery的页面来说则更是如此,这时xpath相比RE就有了决定性的优势。

附录:基本XPATH语法介绍,详细请参考XPath的官方文档

XPATH基本上是用一种类似目录树的方法来描述在XML文档中的路径。比如用“/”来作为上下层级间的分隔。第一个“/”表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。比如对于一个HTML文件来说,最外层的节点应该是”/html”。

同样的,“”和“”分别被用来表示父节点和本节点。

XPATH返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/html/head/scrpt”就会把head里的所有script节点都取出来。

为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“[”“]”把过滤条件加上。比如在HTML文档里使用“/html/body/div[@id='main']”,即可取出body里id为main的div节点。

其中@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class…

而 函数text()的意思则是取得节点包含的文本。比如:<div>hello<p>world</p>< /div>中,用”div[text()='hello']“即可取得这个div,而world则是p的text()。

函数position()的意思是取得节点的位置。比如“li[position()=2]”表示取得第二个li节点,它也可以被省略为“li[2]”。

不过要注意的是数字定位和过滤 条件的顺序。比如“ul/li[5][@name='hello']”表示取ul下第五项li,并且其name必须是hello,否则返回空。而如果用 “ul/li[@name='hello'][5]”的意思就不同,它表示寻找ul下第五个name为”hello“的li节点。

此外,“”可以代替所有的节点名,比如用”/html/body//span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。

而 “descendant::”前缀可以指代任意多层的中间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的 div,可以用“/descendant::div[@id='leftmenu']”,也可以简单地使用“ //div[@id='leftmenu']”。

至于“following-sibling::”前缀就如其名所说,表示同一层的下一个节点。”following-sibling::”就是任意下一个节点,而“following-sibling::ul”就是下一个ul节点。

selxpath() 得到的依旧是一个SelectorList

参看原文档

xpath(query)

Find nodes matching the xpath query and return the result as a SelectorList instance with all elements flattened List elements implement Selector interface too

query is a string containing the XPATH query to apply

那么实际上就是去看Selector 相关的函数了。

————————————————

<p>

AA

<sub>1</sub>

<sub>2</sub>

<sub>3</sub>

</p>

<p>

BB

<sub>1</sub>

<sub>2</sub>

<sub>3</sub>

</p>

对于上述例子,其实可以考虑获取到p之后,对其内容再进行一次查找,即可获得 1 、2 、3的内容。

1 利用Selenium IDE

我们可以通过firefox添加插件Selenium IDE并开启。当点击红色的录制按钮后,我们对网页进行 *** 作后,该工具会录制所有的行为并转化为selenium命令,当然也就包含有了locator。

方法优点:简单、方便

方法不足:对于一些复杂点的行为可能会漏掉,因此也就无法捕获相应的locator;此外locator是自动获取的,可能不是很直观,另外无法得到统一样式的locator。

2 利用Firebug

同样firefox的插件中可以添加firebug。在Tools->Web Developer->Firebug中打开Firebug,于是能够看到页面的下半部分有显示Firebug窗口,可以查看HTML,CSS等。因为了解的粗浅,所以只能说说知道的几点简单功能。

如果我们需要查看页面某个元素的locator,可以鼠标右击,选择Inspect Element with Firebug, 于是就到了元素对应的html源码位置。这样我们根据这部分源码来写locator。

但是,往往对于一些element如button等,右击后没有反应时,我们可以考虑选择它们旁边的元素进行,到源码后再通过查找其兄弟元素源码或者上一层来找到相应源码。这里主要根据是当我们鼠标放在以某tag为根节点的源码的上时,上面的页面对应的界面元素会有相应标记。

方法缺点:写出的locator可能并不是页面的唯一,这样selenium运行就难以识别

以上就是关于python BeautifulSoup获取a标签问题全部的内容,包括:python BeautifulSoup获取a标签问题、jmeter接口测试-17XPath关联、如何在python中使用xpath等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9541798.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存