如何通过 Beautiful Soup 刮掉href中的文本?

Posted

技术标签:

【中文标题】如何通过 Beautiful Soup 刮掉href中的文本?【英文标题】:How to scrape text in a href by Beautiful Soup? 【发布时间】:2016-06-19 07:09:33 【问题描述】:

我有一个<a href="javascript:ShowImg('../UploadFile/Images/c/1/B_27902.jpg');"> 格式的href,我想用'../UploadFile/Images/c/1/B_27902.jpg' 获取网址。我用了一个笨办法得到它:(我想知道有没有更简单的方法得到它。

url = '<a href="javascript:ShowImg('../UploadFile/Images/c/1/B_27902.jpg');">'
html = url.get('href')
html = html.replace('javascript:ShowImg(', '').replace(');', '')

原标签如下:

<a href="javascript:ShowImg('../UploadFile/Images/c/1/B_27902.jpg');">
<img  onerror="this.src='../UploadFile/Images/no_pic_big.jpg';"
src="../UploadFile/Images/c/1/S_27902.jpg" />
</a>

【问题讨论】:

【参考方案1】:

BeautifulSoup 可以在搜索元素时将compiled regular expression pattern 应用于属性值。然后,您可以使用相同的模式来提取所需的部分:

import re
from bs4 import BeautifulSoup

data = """
<a href="javascript:ShowImg('../UploadFile/Images/c/1/B_27902.jpg');">
<img  onerror="this.src='../UploadFile/Images/no_pic_big.jpg';"
src="../UploadFile/Images/c/1/S_27902.jpg" />
</a>
"""

soup = BeautifulSoup(data, "html.parser")
pattern = re.compile(r"javascript:ShowImg\('(.*?)'\);")

href = soup.find('a', href=pattern)["href"]
link = pattern.search(href).group(1)
print(link)  # prints ../UploadFile/Images/c/1/B_27902.jpg

【讨论】:

我试过你的代码,但是soup.find('a', href=pattern)返回None,怎么了? @mikezang 这个也适合我。你确定你在用BeautifulSoup解析的输入数据中有这个a元素吗? 我认为没问题,但我不知道为什么我不能这样做。顺便说一句,我使用的是Python3.5。 brickshelf.com/gallery/mikezang/pics/… @mikezang 在模式字符串之前注意r 前缀 - 这很重要。 代码中有r前缀,我复制了你所有的代码,没有任何修改!

以上是关于如何通过 Beautiful Soup 刮掉href中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

Beautiful Soup 4.2.0 文档

Beautiful Soup 并通过 ID 提取 div

爬虫---Beautiful Soup 爬取知乎热榜

Beautiful Soup

Python Beautiful Soup - 通过 Steam 的年龄检查

Beautiful Soup:如何获取与任何给定字符串匹配的数据