Оптимизация кода BeautifulSoup (Python) - PullRequest
5 голосов
/ 26 апреля 2010

У меня есть код, который использует библиотеку BeautifulSoup для анализа, но он очень медленный. Код написан таким образом, что потоки не могут быть использованы. Кто-нибудь может мне помочь с этим?

Я использую BeautifulSoup для анализа, а затем сохранить в БД. Если я закомментирую оператор save, это все равно займет много времени, поэтому с базой данных проблем не возникнет.

def parse(self,text):                
    soup = BeautifulSoup(text)
    arr = soup.findAll('tbody')                

    for i in range(0,len(arr)-1):
        data=Data()
        soup2 = BeautifulSoup(str(arr[i]))
        arr2 = soup2.findAll('td')

        c=0
        for j in arr2:                                       
            if str(j).find("<a href=") > 0:
                data.sourceURL = self.getAttributeValue(str(j),'<a href="')
            else:  
                if c == 2:
                    data.Hits=j.renderContents()

            #and few others...

            c = c+1

            data.save()

Есть предложения?

Примечание: Я уже задавал этот вопрос здесь , но он был закрыт из-за неполной информации.

1 Ответ

6 голосов
/ 26 апреля 2010
soup2 = BeautifulSoup(str(arr[i]))
arr2 = soup2.findAll('td')

Не делайте этого: просто позвоните arr2 = arr[i].findAll('td').


Это также будет медленно:

if str(j).find("<a href=") > 0:
    data.sourceURL = self.getAttributeValue(str(j),'<a href="')

Предполагая, что getAttributeValue дает вам атрибут href, используйте вместо этого:

a = j.find('a', href=True)       #find first <a> with href attribute
if a:
    data.sourceURL = a['href']
else:
    #....

В общем случае вам не нужно преобразовывать объект BeautifulSoup обратно в строку, если все, что вам нужно, - это проанализировать его и извлечь значения. Так как методы find и findAll возвращают вам объекты поиска, вы можете продолжать поиск, вызывая find / findAll / etc. методы по результатам.

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