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

标签 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 和正则表达式匹配整个模板的优雅方法,因此速度快且匹配绝对正确。

谢谢。

编辑。我在示例页面上对其进行了计时。在我的互联网连接和 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

最佳答案

您不能在使用 lxmlxpath 表达式中使用正则表达式,因为 lxml supports xpath 1.0和 xpath 1.0 doesn't support regular expression search

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

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 解析器:

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 解析更快,您可以 let it use lxml :

soup = BeautifulSoup(data, "lxml")

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

希望有帮助。

关于python - 查找 HTML 页面中与特定 URL 模板匹配的所有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24372752/

相关文章:

python - 替换字符串中一组字符的最快方法

Python 标记字符串

java - Clojure 的正则表达式解析/编译有多智能?

javascript - 使用正则表达式出现无效量词错误(英国电话号码)

xpath - Scrapy xpath无法在网页中找到某些div

python - 如何在给定日期时间值限制下填充数据框中的列?

python - 如何在 awk 或 sed 中编写查找所有函数(使用正则表达式)

c# - 正则表达式否定问题

python - 如何修复操作系统错误: [WinError 6] The handle is invalid with Python and Selenium?

html - Xpath 和 innerHTML