2016-10-13 4 views
0

У меня есть HTML:Вытягивание определенной строки с помощью lxml?

<div title="" data-toggle="tooltip" data-template=" 
<div class=&quot;tooltip infowin-tooltip&quot; role=&quot;tooltip&quot;> 
<div class=&quot;tooltip-arrow&quot;> 
<div class=&quot;tooltip-arrow-inner&quot;> 
</div> 
</div> 
<div class=&quot;tooltip-inner&quot; style=&quot;text-align: left&quot;> 
</div> 
</div>" 
data-html="true" data-placement="top" data-container=".snippet-container" class="font-160 line-110 text-default text-light" data-original-title="HOUSTON [US]"> 
<ahref="/en/ais/details/ports/919" class="no-underline group-ib color-inherit">USHOU</a> 
</div> 

Я хочу, чтобы вытащить "Хьюстоном [США]" из него с помощью lxml. С BeautifulSoup я мог сделать

soup.find("div", class_='font-160 line-110')["title"]

есть что-нибудь подобное в lxml? Я попробовал

parsed_body.xpath('.//div[@class="font-160 line-110 text-default text-light")["title"]')[0].text 

Но это возвращает пустое.

ответ

1

Вы можете использовать XPath:

//div[@class="font-160 line-110 text-default text-light"]/@data-original-title 

в XPath, квадратные скобки представляют собой предикаты. Фильтр предикатов , который возвращается, не затрагивая , что возвращается. т. е. ваш пример вернет сам элемент div.

Чтобы получить значение атрибута, вам необходимо использовать разделитель путей (/), за которым следует символ @ и имя атрибута.

+0

Это также возвращает пустой список ... –

+0

'('// div/@ data-original-title')' это, похоже, работает для копии и вставленной строки выше, однако при разборе html он не делает, т. Что странно, потому что '('// div/@ data-placement')' возвращает '['top']' как при разборе html. Почему это должно быть? –

+0

Есть ли более одного 'div' с атрибутом' data-original-title' в вашем полном HTML? –

0

В итоге я использовал //div/@title[0], который тянет нужный текст.