使用Beautifulsoup通过文本获取Href

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Beautifulsoup通过文本获取Href相关的知识,希望对你有一定的参考价值。

我正在使用“请求”和“beautifulsoup”来搜索具有特定文本的网页中的所有href链接。我已经做到了,但是如果文本出现在新行中,beautifulsoup不会“看到”它并且不会返回该链接。

soup = BeautifulSoup(webpageAdress, "lxml")

path = soup.findAll('a', href=True, text="Something3")
print(path)

例:

像这样,它返回Something3文本的Href:

...
<a href="page1/somethingC.aspx">Something3</a>
...

像这样,它不会返回Something3文本的Href:

...
<a href="page1/somethingC.aspx">
Something3</a>
...

区别在于Href文本(Something3)在一个新行中。我无法更改html代码,因为我不是该网页的网站管理员。

知道怎么解决这个问题?

注意:我已经尝试过使用soup.replace(' n','')。replace(' r','')但是我得到错误NoneType'对象不可调用。

答案

您可以使用正则表达式查找包含“”Something3“的任何文本:

html = '''<a href="page1/somethingC.aspx">Something3</a>

<a href="page1/somethingC.aspx">
Something3</a>'''


from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(html, "lxml")

path = soup.findAll('a', href=True, text=re.compile("Something3"))

for link in path:
    print (link['href'])
另一答案

您可以将:contains伪类与bs4 4.7.1一起使用

from bs4 import BeautifulSoup as bs

html = '<a href="page1/somethingC.aspx">Something3</a>'
soup = bs(html, 'lxml')
links = [link.text for link in soup.select('a:contains(Something3)')]
print(links)
另一答案

没有正则表达式的解决方案:

path = soup.select('a')
if path[0].getText().strip() == 'Something3':
print(path)

输出:

[<a href="page1/somethingC.aspx">
Something3</a>]

以上是关于使用Beautifulsoup通过文本获取Href的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 BeautifulSoup4 获取 <br> 标签之前的所有文本

如何使用 BeautifulSoup 在标签内获取 html 文本

使用 BeautifulSoup 查找包含特定文本的 HTML 标签

从 <span 类中获取文本:使用 Beautifulsoup 和请求

如何使用 BeautifulSoup 从父子标签中获取文本以放入 DOCX 表中

Python BeautifulSoup 获取文本第一个标签