Как извлечь ссылки с веб-страницы с помощью lxml, XPath и Python?

У меня есть этот запрос xpath:

/html/body//tbody/tr[*]/td[*]/a[@title]/@href

Он извлекает все ссылки с атрибутом title и выдает href в средстве проверки FireFox Xpath. надстройка.

Однако я не могу использовать его с lxml.

from lxml import etree
parsedPage = etree.HTML(page) # Create parse tree from valid page.

# Xpath query
hyperlinks = parsedPage.xpath("/html/body//tbody/tr[*]/td[*]/a[@title]/@href") 
for x in hyperlinks:
    print x # Print links in <a> tags, containing the title attribute

Это не дает результата из lxml (пустой список).

Как можно получить href текст (ссылку) гиперссылки, содержащей заголовок атрибута с lxml в Python?


person torger    schedule 18.01.2010    source источник
comment
Имеет ли документ, который вы анализируете, заданное пространство имен (xmlns)?   -  person Emil Stenström    schedule 23.01.2010


Ответы (2)


Мне удалось заставить его работать с помощью следующего кода:

from lxml import html, etree
from StringIO import StringIO

html_string = '''<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en">
<head/>
<body>
    <table border="1">
      <tbody>
        <tr>
          <td><a href="http://stackoverflow.com/foobar" title="Foobar">A link</a></td>
        </tr>
        <tr>
          <td><a href="http://stackoverflow.com/baz" title="Baz">Another link</a></td>
        </tr>
      </tbody>
    </table>
</body>
</html>'''

tree = etree.parse(StringIO(html_string))
print tree.xpath('/html/body//tbody/tr/td/a[@title]/@href')

>>> ['http://stackoverflow.com/foobar', 'http://stackoverflow.com/baz']
person jkp    schedule 18.01.2010

Firefox добавляет дополнительные HTML-теги в html при его рендеринге, что делает xpath, возвращаемый инструментом firebug, несовместимым с фактическим html, возвращаемым сервером (и тем, что вернет urllib/2).

Удаление тега <tbody> обычно помогает.

person mrmagooey    schedule 06.12.2011