REGEX提取部分链接

时间:2016-02-20 08:13:36

标签: python regex

我的目标是从拍卖网站页面上删除一些拍卖ID。该页面为here

对于我感兴趣的页面,大约有60个拍卖ID。 auctionID前面有一个破折号,由10位数字组成,并在.htm之前终止。例如,在下面的链接中,ID将为0133346952

<a href="/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm" class="tile-2">

我已经通过识别&#34; a&#34;来提取所有链接。标签。此代码位于页面底部。

根据我的有限知识,我会说REGEX应该是解决这个问题的正确方法。我在想REGEX就像:

-...........htm

但是,我无法将正则表达式成功集成到代码中。我会有像

这样的东西
for links in soup.find_all('-...........htm'):

会做到这一点,但显然不是。

如何修复此代码?

import bs4
import requests
import re
res = requests.get('http://www.trademe.co.nz/browse/categorylistings.aspx?mcatpath=sports%2fcycling%2fmountain-bikes%2ffull-suspension&page=2&sort_order=default&rptpath=5-380-50-7145-')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
for links in soup.find_all('-...........htm'):
    print (links.get('href'))

6 个答案:

答案 0 :(得分:2)

以下代码有效:

for links in soup.find_all(href=re.compile("auction-[0-9]{10}.htm")):
    h = links.get('href')
    m = re.search("auction-([0-9]{10}).htm", h)
    if m:
        print(m.group(1))

首先,你需要一个正则表达式来提取href。然后你需要一个捕获正则表达式来提取id。

答案 1 :(得分:0)

您必须将regular expression对象传递给titles["title1"] != nil ? titles["title1"]! : "No title" } 只需输入一个你想用作正则表达式模式的字符串。

要学习和调试这类东西,从网站缓存数据直到工作正常是有用的:

find_all()

一旦你获得了一些匹配,你就可以使用更复杂的技术改进你的正则表达式模式,但这比我开始使用正确的“框架”快速尝试一样不那么重要(无需等待每次下载代码更改测试)。

答案 2 :(得分:0)

import re
p = re.compile(r'-(\d{10})\.htm')
print(p.search('<a href="/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm" class="tile-2">'))
res = p.search('<a href="/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm" class="tile-2">')
print(res.group(1))

-(\d{10})\.htm表示您需要一个短划线,10位数字和.htm。更重要的是,这10个数字位于捕获组中,因此您可以稍后提取它们。

您搜索此模式,然后您有两个组:一个具有整个模式,另一个具有捕获组(仅10个数字)。

答案 3 :(得分:0)

在python中你可以做到:

import re
text = """<a href="/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm" class="tile-2">"""
p = re.compile(r'(?<=<a\shref=").*?(?=")')
re.findall(p,text) ## ['/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm']

答案 4 :(得分:0)

这很简单;你不需要正则表达式。让s成为你的字符串(由于我不知道如何处理环绕,我无法将整行放在这里。)

s = '<a href="....../auction-1033346952.htm......>'
i = s.find('auction-')
j = s[i+8:i+18]
print j

答案 5 :(得分:0)

最简单的方法

>>> s='<a href="/sports/cycling/mountain-bikes/full-suspension/auction-1033346952.htm" class="tile-2">'
>>> s.split('.htm')[0].split('-')[-1]
'1033346952'