Beautifulsoup问题在寻找锚标签



我试图在我的python脚本中捕获一个链接。我有一个变量保存正则表达式模式。

我想从页面HTML中捕获下面的链接。

<a class="pg-normal pg-bton" href="/department/office/pg2"> NEXT >> </a>

代码是:

parser = "lxml" 
next_regex = r'(.*?)NEXT(.*?)'
html_bodySoup = BeautifulSoup(urllib.request.urlopen(url), parser)
links = html_bodySoup.find_all('a', href = re.compile(nextpg_regex))

找不到问题是什么,但它没有给我想要的链接。我也尝试了其他更准确的正则表达式模式。

这里不需要正则表达式。您可以简单地检查NEXT是否为in节点文本。

可以使用

links = html_bodySoup.find_all(lambda x: x.name=='a' and  'NEXT' in x.text)

这里,我们在节点文本中搜索具有a名称和NEXT的任何标记。

Python测试:

from bs4 import  BeautifulSoup
html = '<p><a class="pg-normal pg-bton" href="/department/office/pg2"> NEXT >> </a></p>'
parser = "lxml"
html_bodySoup = BeautifulSoup(html, parser)
html_bodySoup.find_all(lambda x: x.name=='a' and  'NEXT' in x.text)
# => [<a class="pg-normal pg-bton" href="/department/office/pg2"> NEXT &gt;&gt; </a>]

如果你想搜索一个精确的词NEXT,那么你可以使用这样的正则表达式:

html_bodySoup.find_all(lambda x: x.name=='a' and re.search(r'bNEXTb', x.text))
# => [<a class="pg-normal pg-bton" href="/department/office/pg2"> NEXT &gt;&gt; </a>]

其中re.search在字符串内的任何地方搜索匹配,bNEXTb模式确保它找到的NEXT是一个完整的单词(感谢单词边界)。

您也可以使用-soup-contains来定位该文本。但是,看起来您可能只需要使用类(多值之一)。下面显示了一些选项,其中最具描述性的没有被注释掉:

from bs4 import BeautifulSoup as bs
html = '''<a class="pg-normal pg-bton" href="/department/office/pg2"> NEXT >> </a>'''
soup = bs(html, 'lxml')
# soup.select_one('.pg-bton[href*=department]:-soup-contains("NEXT")')
# soup.select_one('.pg-bton')
soup.select_one('.pg-bton[href*=department]:-soup-contains("NEXT")')

最新更新