关于python:在HTML页面中查找与特定URL模板匹配的所有链接

Finding all links matching specific URL template in an HTML page

所以假设我有以下基本 url http://example.com/Stuff/preview/v/{id}/fl/1/t/。正在解析的页面上有许多具有不同 {id} 的 url。我想在 HTML 页面中找到与此模板匹配的所有链接。

我可以使用 xpath 来匹配模板的一部分//a[contains(@href,preview/v] 或者只使用正则表达式,但我想知道是否有人知道使用 xpath 和正则表达式匹配整个模板的更优雅的方式,所以它快速且匹配绝对正确。

谢谢。

编辑。我在示例页面上对其进行了计时。通过我的互联网连接和 100 次试验,迭代平均需要 0.467 秒,BeautifulSoup 需要 0.669 秒。

如果你有 Scrapy,它也可以使用 Selectors。

1
2
3
  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


您不能使用 lxmlxpath 表达式中使用正则表达式,因为 lxml 支持 xpath 1.0xpath 1.0 不支持正则表达式搜索。

相反,您可以使用 iterlinks() 找到页面上的所有链接,遍历它们并检查 href 属性值:

1
2
3
4
5
6
7
8
9
10
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

另一种选择是使用 BeautifulSoup html 解析器:

1
2
3
4
5
6
7
8
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})

为了使 BeautifulSoup 解析更快,你可以让它使用 lxml:

1
soup = BeautifulSoup(data,"lxml")

此外,您可以使用 SoupStrainer 类,它可以让您仅解析特定网页部分而不是整个页面。

希望对您有所帮助。