所以我想说我有以下基本网址http://example.com/Stuff/preview/v/{id}/fl/1/t/
。在解析的页面上有许多具有不同{id}的URL。我想在HTML页面中找到与此模板匹配的所有链接。
我可以使用xpath来匹配模板//a[contains(@href,preview/v]
的一部分或只使用正则表达式,但我想知道是否有人知道使用xpath和regexes匹配整个模板的更优雅的方式所以它的速度很快这些比赛肯定是正确的。
感谢。
编辑。我把它放在样本页面上。通过我的互联网连接和100次试验,迭代平均需要0.467秒,而BeautifulSoup需要0.669秒。
此外,如果你有Scrapy,它可以使用Selectors。
data=get(url).text
sel = Selector(text=data, type="html")
a=sel.xpath('//a[re:test(@href,"/Stuff/preview/v/\d+/fl/1/t/")]//@href').extract()
平均时间也是0.467
答案 0 :(得分:3)
由于lxml
supports xpath 1.0
和xpath
doesn't support regular expression search,您无法在使用lxml
的{{1}}表达式中使用正则表达式。
相反,您可以使用iterlinks()
找到网页上的所有链接,对其进行迭代并检查xpath 1.0
属性值:
href
另一种选择是使用BeautifulSoup
html解析器:
import re
import lxml.html
tree = lxml.html.fromstring(data)
pattern = re.compile("http://example.com/Stuff/preview/v/\d+/fl/1/t/")
for element, attribute, link, pos in tree.iterlinks():
if not pattern.match(link):
continue
print link
要使import re
from bs4 import BeautifulSoup
data = "your html"
soup = BeautifulSoup(data)
pattern = re.compile("http://example.com/Stuff/preview/v/\d+/fl/1/t/")
print soup.find_all('a', {'href': pattern})
解析更快,您可以let it use lxml
:
BeautifulSoup
此外,您可以使用SoupStrainer
类,只允许您解析特定的网页部分而不是整页。
希望有所帮助。