2014-01-21 5 views
1

Краткое объяснение: У меня есть скрипт, который перемещается по элементам страницы, а затем возвращает данные. Но я хочу, чтобы он возвращал данные, которые не находятся в элементе, а в порядке.Получение данных из тегов (BeautifulSoup)

import argparse, os, socket, urllib2, re 
from bs4 import BeautifulSoup 
pge = urllib2.urlopen("").read() 
src = BeautifulSoup(pge) 
body = src.findAll('body') 
el = body[0].findChildren() 
for s in el: 
    cname = s.get('class') 
    if cname[0] == "work": 
     print s.text 

HTML:

<body> 
    <div class="work">1</div> 
    <span class="nope">tosee</span> 
    <span class="work">2</span> 
    <span class="work">3</span> 
    4 
    <span class="work">5</span> 
    <span class="no">nothing</span> 
</body> 

Он печатает 1235 и пропускает на 4, но я хотел бы, чтобы напечатать 12345

ответ

1

Просто:

print soup.find('body').text 
+0

То, что я вам дал, было плохим примером, пожалуйста, проверьте обновление. – user273324

+0

В чем разница? Это все равно должно работать для вашего дела. – aIKid

+0

Дело в том, что просто получите родительский тег, и все должно быть в порядке. – aIKid

0

Я отформатировали html с разрывами строк, чтобы показать, почему 4 не печатает, где вы ожидаете.

Вы повторяете детей и печатаете текст от любых детей, которые относятся к классу «работа». Число 4 не соответствует этим критериям, потому что это текст, а не ребенок с классом «работа».

Я не думаю, что BeautifulSoup может декодировать этот конкретный html, как вы ожидали.

Одним из решений было бы проанализировать сам html, поскольку это не типичная ситуация. Одним из способов может быть использовать регулярные выражения, чтобы найти примеры что-то вроде:

</span>(not_blank)<span class="{classregex}">(remember)</span> 

Создание словаря {помните: not_blank}. Затем, когда вы зацикливаете body.children(), проверьте s.text() на этот словарь. Если это ключ, напечатайте значение, затем напечатайте s.text().

В зависимости от того, что фактический HTML является это может работать ...

0

Вы можете сделать:

arr = [] 
# Get all text elements 
for i in body[0].find_all(text=True): 
    # append to array if it's 'work' element or has no class 
    if not i.parent.has_attr("class") or "work" in i.parent["class"]: 
    arr.append(i) 

Это, конечно, работает, только если следующие два правила всегда справедливы:

  1. действительный текстовый элемент находится внутри класса = «work», или
  2. действительный текстовый элемент находится внутри тега, который не имеет атрибута класса
Смежные вопросы