python:如何改进代码片段以按顺序解析元素
我希望在一个html块中找到我希望找到的所有元素,然后对其进行排序,以便所有标记在我的列表中都有它的位置,例如:('h3','a','img') 我想知道是否有更好的方法来解决我的问题,更美观,更容易扩展(添加更多标签) 所以我可以把这个列表发送给一个函数,而不必三思而后行 以下是运行代码段后的结果:python:如何改进代码片段以按顺序解析元素,python,Python,我希望在一个html块中找到我希望找到的所有元素,然后对其进行排序,以便所有标记在我的列表中都有它的位置,例如:('h3','a','img') 我想知道是否有更好的方法来解决我的问题,更美观,更容易扩展(添加更多标签) 所以我可以把这个列表发送给一个函数,而不必三思而后行 以下是运行代码段后的结果: [ ('text 1', '/url1', '/img1.png'), ('text 2', '/url2', '/img3.png'), ('text 3', '/url3', '/img3.p
[
('text 1', '/url1', '/img1.png'),
('text 2', '/url2', '/img3.png'),
('text 3', '/url3', '/img3.png'),
]
片段:
def parse_element_tag(el):
#<class 'lxml.html.HtmlElement'>
dict = {'a': (el.get('href'), 1), 'img': (el.get('src'), 2), 'h3': (el.text, 0)}
return dict[el.tag]
requests_cache.configure('test', expire_after=900)
r = readUrl('http://www.svtplay.se/program')
l = lxml.html.fromstring(r.text)
lst = []
for el in l.cssselect('div ul.svtGridBlock li div a'):
#lst.append(sorted([parse_element_tag(i) for i in el.iter()], key=lambda val: val[1]))
lst.append(
tuple([i[0] for i in sorted(
[parse_element_tag(i) for i in el.iter() if i.tag in ('a', 'img', 'h3')], key=lambda val: val[1]
)]
))
def parse_element_标签(el):
#
dict={'a':(el.get('href'),1),'img':(el.get('src'),2),'h3':(el.text,0)}
返回指令[el.tag]
请求\u cache.configure('test',过期\u=900)
r=readUrl('http://www.svtplay.se/program')
l=lxml.html.fromstring(r.text)
lst=[]
对于l.CSS中的el,选择('div ul.svtGridBlock li div a'):
#追加(已排序([parse_element_tag(i)for i in el.iter()],key=lambda val:val[1]))
附加(
元组([i[0]表示排序中的i)(
[parse_element_tag(i)for i in el.iter()如果i.tag in('a','img','h3'),key=lambda val:val[1]
)]
))
使用:
(a) 您可能应该显示一些输入(b)这更适合codereview站点。@Marcin:(a)输入是引用url处的html(b)您可能是对的@用户2417865:你的问题有点模糊。但是,为了便于添加更多标记,请将
if i.tag in
子句中使用的('a','img','h3')
作为变量,而不是硬编码。@martineau我并不在乎是否有url。很高兴看到实际输入。循环中“el”的html输入示例:
def parse_element_tag(el, path):
matched = el.xpath(path)
if matched:
return matched[0].strip()
return ''
lst = []
paths = './/h3/text()', './@href', './/img/@src'
for el in l.cssselect('div ul.svtGridBlock li div a'):
lst.append(tuple(parse_element_tag(el, path) for path in paths))
>>> for x in lst: print(x)
('Barn', '/kategorier/barn', '/public/images/categories/kat-barn.png')
(u'Dokument\xe4r', '/kategorier/dokumentar', '/public/images/categories/kat-dokumentar.png')
('Film & Drama', '/kategorier/filmochdrama', '/public/images/categories/kat-filmochdrama.png')
(u'Kultur & N\xf6je', '/kategorier/kulturochnoje', '/public/images/categories/kat-kulturochnoje.png')
('Nyheter', '/kategorier/nyheter', '/public/images/categories/kat-nyheter.png')
(u'Samh\xe4lle & Fakta', '/kategorier/samhalleochfakta', '/public/images/categories/kat-samhalleochfakta.png')
('Sport', '/kategorier/sport', '/public/images/categories/kat-sport.png')
('', '/kategorier/oppetarkiv', '/public/images/categories/kat-oppetarkiv.png')