假设我有以下基本网址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
最佳答案
您不能在使用 lxml
的 xpath
表达式中使用正则表达式,因为 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/