因此,假设我有下面的基本url http://example.com/Stuff/preview/v/{id}/fl/1/t/
。正在解析的页面上有许多具有不同{id}的urls。我希望在HTML页面中找到与此模板匹配的所有链接。
我可以使用xpath与模板//a[contains(@href,preview/v]
的一部分进行匹配,也可以只使用regexes,但是我想知道是否有人知道使用xpath和regexes与整个模板匹配的方法更优雅,其速度如此之快,而且匹配绝对正确。
谢谢。
编辑。我在一个示例页面上计时。通过我的互联网连接和100个试验,迭代平均需要0.467秒,BeautifulSoup需要0.669秒。
此外,如果您有Scrapy,它的一个可以使用选择器。
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。
发布于 2014-06-23 10:29:10
您不能使用lxml
在xpath
表达式中使用正则表达式,因为xpath 1.0
和xpath 1.0
不支持正则表达式搜索。
相反,您可以使用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
解析速度更快,可以使用lxml
soup = BeautifulSoup(data, "lxml")
此外,您还可以使用SoupStrainer
类,它允许您只解析特定的网页部件,而不是解析整个页面。
希望这能有所帮助。
https://stackoverflow.com/questions/24372752
复制