Python中利用BeautifulSoup4反查包含文本内容的标签

1 问题引出

编写爬取Amazon服装行业数据时,遇到一个问题:根据文本内容Next反查包含它的父标签。请看下面HTML片段

<li class="a-last">
<a href="/s?k=red+tshirt&amp;i=fashion-mens&amp;page=2&amp;qid=1588904638&amp;ref=sr_pg_1">Next
<span class="a-letter-space"></span>
<span class="a-letter-space"></span></a>
</li>

我需要根据Next反查包含它的标签a,以此获取href属性的值。最近编写很多爬虫项目,积累了一定的经验,于是,我认为上述很简单,编写如下代码:

# testBs.py
from bs4 import BeautifulSoup
import re 
str = """<li class="a-last"><a href="/s?k=red+tshirt&amp;i=fashion-mens&amp;page=2&amp;qid=1588904638&amp;ref=sr_pg_1">Next<span class="a-letter-space"></span><span class="a-letter-space"></span>→</a></li>""" 

soup = BeautifulSoup(str,'lxml')
a = soup.find('a',text=re.compile(r"Next"))
print(a)

运行后,如下:
在这里插入图片描述
也就是说,查不到标签a

2 问题分析

若将HTML片段改为标签a下不含子标签span的话,即

<li class="a-last">
<a href="/s?k=red+tshirt&amp;i=fashion-mens&amp;page=2&amp;qid=1588904638&amp;ref=sr_pg_1">Next</a>
</li>

则上述代码可以得到结果:
在这里插入图片描述
我分析,肯定是代码a = soup.find('a',text=re.compile(r"Next"))有问题。那么针对原HTML片段,为了不受查询标签a的限制,我将核心代码改为:

a = soup.find(text=re.compile(r"Next"))
print(a)

运行结果为:
在这里插入图片描述
这是一个好的象征,离成功近了一步。经过查阅BeautifulSoup4的资料,此时得到的对象是一个BeautifulSoup.NavigableString对象,我们可以利用代码查看变量a的信息:

from bs4 import BeautifulSoup
import re 
import pprint
str = """<li class="a-last"><a href="/s?k=red+tshirt&amp;i=fashion-mens&amp;page=2&amp;qid=1588904638&amp;ref=sr_pg_1">Next<span class="a-letter-space"></span><span class="a-letter-space"></span>→</a></li>""" 

soup = BeautifulSoup(str,'lxml')
a = soup.find(text=re.compile(r"Next"))
#print(a)
pprint.pprint(a.__dict__)

运行结果为:
在这里插入图片描述
那么此时我们的问题答案已经很明了了。

3 解决方案

最终,利用文本内容(且与其同一层还有其他标签)反查包含它的标签的属性值的代码如下:

from bs4 import BeautifulSoup
import re 
import pprint
str = """<li class="a-last"><a href="/s?k=red+tshirt&amp;i=fashion-mens&amp;page=2&amp;qid=1588904638&amp;ref=sr_pg_1">Next<span class="a-letter-space"></span><span class="a-letter-space"></span>→</a></li>""" 

soup = BeautifulSoup(str,'lxml')
a = soup.find(text=re.compile(r"Next"))

print(a.parent.get('href'))

代码运行结果为:
在这里插入图片描述
完美!!!

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值