我的目标是从拍卖网站页面上删除一些拍卖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'))
答案 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)
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'