查找与HTML页面中的特定URL模板匹配的所有链接

时间:2014-06-23 18:23:12

标签: python regex xpath html-parsing lxml

所以我想说我有以下基本网址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

1 个答案:

答案 0 :(得分:3)

由于lxml supports xpath 1.0xpath 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类,只允许您解析特定的网页部分而不是整页。

希望有所帮助。