我试图在我的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 >> </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 >> </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")')