python +美丽的汤,没有属性的帮助导航解析树?

时间:2017-09-03 23:56:11

标签: python html beautifulsoup

我试图从此页面抓取文字: 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标记?

提前感谢!

1 个答案:

答案 0 :(得分:0)

只要'大于'这个就会工作。带有前导和尾随空格的符号('>')不会出现在您想要的字符串对之前:

gt = soup.find(text=' > ')
string1 = gt.findPrevious('span').text
string2 = gt.findNext('span').text

print(string1, gt, string2, sep='')

输出:

Warmup-1 > sleepIn