如何在python 3中减去soup.find_all()

时间:2016-11-28 02:46:13

标签: python regex beautifulsoup

我想更改soup.find.all的输出。在原始资料中我们有:

<a href="/book/nfo/?id=4756888" class="ajax nfo"></a>

我的soup.find_all

href = [b.get('href') for b in soup.find_all('a', href=re.compile(r'.*\?id\=\d{4,8}'))]

给了我这个:

/book/nfo/?id=4756888

但我想要这个:

http://127.0.0.1/book/download/?id=4756888

3 个答案:

答案 0 :(得分:1)

您可以使用Python string的属性向其添加和替换部件:

a='/book/nfo/?id=4756888'
b = 'http://127.0.0.1' + a.replace('nfo', 'download')
print(b)

给出:

'http://127.0.0.1/book/download/?id=4756888'

此处无需使用regex

答案 1 :(得分:0)

你可以在前面添加http://127.0.0.1并使用python的re.sub()函数将'nfo'替换为'download'。

re.sub(r'pattern_to_match',r'replacement_string', string)

您可以按如下方式实施:

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup("""<a href="/book/nfo/?id=4756888" class="ajax nfo"></a>""")
c = ['http://127.0.0.1'+b.get('href') for b in soup.find_all('a', href=re.compile(r'.*\?id\=\d{4,8}'))]
print([re.sub(r'nfo',r'download',q) for q in c ])

输出:

['http://127.0.0.1/book/download/?id=4756888']

答案 2 :(得分:0)

您可以编译正则表达式并将其应用于列表推导中,如下所示:

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup('<a href="/book/nfo/?id=4756888" class="ajax nfo"></a>', 'html.parser')
re_s = re.compile(r'(.*?\/)nfo(\/.*?)').sub
hrefs = [re_s('http://127.0.0.1' + r'\1download\2', a.get('href')) for a in soup.find_all('a', href=re.compile(r'.*\?id\=\d{4,8}'))]
print(hrefs)

给你:

['http://127.0.0.1/book/download/?id=4756888']