Расширение выбора с BeautifulSoup - PullRequest
1 голос
/ 18 марта 2012

Я пытаюсь заставить BeautifulSoup сделать следующее.

У меня есть файлы HTML, которые я хочу изменить.В частности, меня интересуют два тега, один из которых я назову TagA

<div class ="A">...</div>

, а другой - TagB

<p class = "B">...</p>

Оба тега встречаются независимо в HTML и могутсами по себе содержат другие теги и могут быть вложены в другие теги.Я хочу разместить маркерный тег вокруг каждого TagA всякий раз, когда за немедленно не следует за TagB, так что

<p class="A"">...</p> becomes <marker><p class="A">...</p></marker>

Но когда за TagA сразу следует за TagB,Я хочу, чтобы маркерный тег окружал их обоих

, чтобы

<p class="A">...</p><div class="B">...</div> 
becomes 
<marker><p class="A">...</p><div class="B">...</div></marker>

Я мог видеть, как выбрать TagA и заключить его в маркерный тег, но когда за ним следует TagB, я делаюне знаю, можно ли расширить выбор BeautiulSoup для включения NextSibling.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 20 марта 2012

Я думаю, что поступил неправильно, пытаясь расширить «выбор» от одного тега до следующего.Вместо этого я нашел следующий код, который вставляет внешний тег 'Marker', а затем вставляет теги A и B.Я довольно новичок в Python, поэтому буду признателен за советы относительно улучшений или ошибок со следующим.

def isTagB(tag):
#If tag is <p class = "B"> return true
#if not - or tag is just a string return false
    try:
        return tag.name == 'p'#has_key('p') and tag.has_key('B')
    except:
        return False

from bs4 import BeautifulSoup

soup = BeautifulSoup("""<div class = "A"><p><i>more content</i></p></div><div class = "A"><p><i>hello content</i></p></div><p class="B">da <i>de</i> da </p><div class = "fred">not content</div>""")


for TagA in soup.find_all("div", "A"):
    Marker = soup.new_tag('Marker')
    nexttag = TagA.next_sibling
    #skipover white space
    while str(nexttag).isspace():
        nexttag = nexttag.next_sibling
    if isTagB(nexttag):
        TagA.replaceWith(Marker)   #Put it where the A element is
        Marker.insert(1,TagA)
        Marker.insert(2,nexttag)
    else:
        #print("FALSE",nexttag)
        TagA.replaceWith(Marker)   #Put it where the A element is
        Marker.insert(1,TagA)
print (soup)
0 голосов
/ 28 мая 2013
import urllib
from BeautifulSoup import BeautifulSoup
html = urllib.urlopen("http://ursite.com") #gives html response
soup = BeautifulSoup(html)

all_div = soup.findAll("div",attrs={}) #use attrs as dict for attribute parsing 
#exa- attrs={'class':"class","id":"1234"}

single_div = all_div[0]

#to find p tag inside single_div
p_tag_obj = single_div.find("p")

вы можете использовать obj.findNext (), obj.findAllNext (), obj.findALLPrevious (), obj.findPrevious (), чтобы получить атрибут, вы можете использовать obj.get ("href"), obj.получить ("название") и т. д.

0 голосов
/ 18 марта 2012

beautifulSoup имеет функцию «следующий брат».найдите все теги класса A и используйте a.next_sibling, чтобы проверить, является ли это b.

, посмотрите документы:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#going-sideways

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...