2015-07-19 2 views
1

Я учусь BeautifulSoup и есть веб-страницу, которая имеет тело что-то вроде этого:BeautifulSoup: Циклическое над элементами, чтобы получить текст

HTML:

<div> 
<table> 
<tr> 
    <td> 
    <div> 
    <a name='abc'>....</a> 
    </div> 
    </td> 
</tr> 
</table> 
</div> 
<a name='pqr'>...</a> 
<div>text1</div> 
<div>text2</div> 
<div>text3</div> 
<a name='mno'>...</a> 

<div> 
<table> 
<tr> 
    <td> 
    <div> 
    <a name='xyz'>....</a> 
    </div> 
    </td> 
</tr> 
</table> 
</div> 

Ожидаемый результат:

<a name='pqr'>...</a> 
<div>text1</div> 
<div>text2</div> 
<div>text3</div> 
<a name='mno'>...</a> 

Я хочу сказать, что все содержимое до тех пор, пока не будет достигнут тег 'name =' xyz '

ответ

0

Вы можете make a function что бы получить все div элементы, имеющие предыдущий родственный pqr ссылку и следующий родственный mno ссылка:

def desired_divs(elm): 
    if elm and elm.name == "div" and \ 
      elm.find_previous_sibling("a", {"name": "pqr"}) and \ 
      elm.find_next_sibling("a", {"name": "mno"}): 
     return elm 

for div in soup.find_all(desired_divs): 
    print(div.text) 

распечаток:

text1 
text2 
text3 

В качестве альтернативы, вы можете найти элемент начало a, то перебирать все последующие элементы и останавливаться, как только вы нажмете на конец a элемент собирая div тексты в пути:

beginning = soup.find("a", {"name": "pqr"}) 
for elm in beginning.find_next_siblings(): 
    if elm.name == "a" and elm.get("name") == "mno": 
     break 

    print elm.text 
+0

Пытался передать («а», { «имя»: «ABC»}) в качестве аргумента, но он только что вернулся текст, написанный в между тегом 'a' – anonymous

+0

@anonymous, почему вы это сделали? Функция 'wish_divs' предназначена для передачи в' find() 'или' find_all() ', как показано в примере кода. – alecxe

+0

О да, какая глупая ошибка. Но я думаю, что ваша функция кода даст текст между всеми тегами div. Веб-страница довольно большая, и тело в значительной степени повторяется. Включая теги, которые называются «mno» и «pqr». Есть ли способ, которым я могу начать синтаксический анализ с «abc» до «xyz», потому что это тот, который продолжает меняться – anonymous

0

Я попробовал это, и она работала:

aref=soup.find('a',{"name": "abc"}) 

for i in aref.findAllNext(): 
    if(i.attrs=={'name': 'xyz'}): 
     break 
    else: 
     print(i.text) 
Смежные вопросы