我试图从此页面抓取文字: http://codingbat.com/prob/p187868
具体来说,我想从页面中抓取两个字符串,将字典中的键与作为值的问题语句组合在一起。这些是问题名称的两个部分(此处:' Warmup-1'' sleepin')。但是,字符串包含在解析树的不同级别中,这就产生了问题。
抽象地说,问题是:
我试图从以下的解析树中删除文本:
div - > {[a [span' h2' [string1]]],[span' h2' [string2]],其他一些标签}
因为它们都包含在&span;' span'标签属性为class =' h2',我可以抓取这些标签的列表,然后从列表中选择。
div_nameparts = name_div.find_all('span', class_='h2')
name1 = div_nameparts[0].string
name2 = div_nameparts[1].string
problem_name = name1+' > '+name2
print(problem_name)
但是如果这些标签没有像他们在这里那样分享属性怎么办?' h2'?
如果我尝试使用div.a.string导航解析树,我可以获得第一个标记 - string1。但div.span.string不返回第二个值(string2)。
name1 = name_div.a.string
name2 = name_div.span.string
它会再次返回第一个(string1),显然导航到div.a.span(孩子的孩子)并停止,然后找到div.span(下一个孩子)的路。
如果我尝试div.a.next_sibling尝试导航到div.span并使用div.span.string获取字符串,
name1 = name_div.a.string
name2_div = name_div.a.next_sibling
name2 = name2_div.string
它返回一个空字符串,值为None。
是否有更好/更有效的方法来导航解析树以获取这些span标记?
提前感谢!
答案 0 :(得分:0)
只要'大于'这个就会工作。带有前导和尾随空格的符号('>')不会出现在您想要的字符串对之前:
gt = soup.find(text=' > ')
string1 = gt.findPrevious('span').text
string2 = gt.findNext('span').text
print(string1, gt, string2, sep='')
输出:
Warmup-1 > sleepIn