2012-01-13 2 views
4

Как найти определенный div, вызывая атрибуты супа? то есть что-то вроде soup.html.body.div, однако я не вижу, как получить конкретный div с id='idname' здесь?Beautifulsoup навигационные divs по атрибуту без findAll

Я могу сделать soup.findAll(id='idname')[0], чтобы получить конкретный тег, но, как я понимаю, это ищет весь суп.

Я предполагаю, что получение атрибута div по супу будет быстрее, так как вы не используете findAll()?

Firebug сообщает об этом html.body.div[2].form.table[2].tbody.tr[3]... тем не менее делает soup.html.body.div[2]дает ключевую ошибку.

Update:

Допустим, вы хотите, чтобы захватить Мне повезёт кнопку от http://www.google.com, поджигатель сообщает, что в качестве существа:

/html/body/center/span/center/div[2]/form/div[2]/div[3]/center/input[2]

Есть ли способ, чтобы достичь это без с использованием findAll?

ответ

3

Путь, который вы получаете от Firebug, - выражение XPath. Лучше всего использовать парсер, который позволяет напрямую использовать xpath. Мне нравится использовать lxml с интерфейсом etree:

from lxml import etree 
tree = etree.parse(yourfile) 
lucky = tree.xpath('/html/body/center/span/center/div[2]/form/div[2]/div[3]/center/input[2]') 
1

Существует findChildren метод, который получает большую часть пути туда.

Это эквивалентно:

findAll(tagname, recursive=False) 

, которые обычно делают его гораздо более эффективным.

Так что ваш пример станет:

soup.html.body.center.span.center.findChildren('div')[2].\ 
    form.findChildren('div')[2].findChildren('div')[3].\ 
    center.findChildren('input')[2] 
Смежные вопросы