Python: Почему Xpath, по-видимому, обрабатывает только первый элемент в этом дереве? - PullRequest
2 голосов
/ 28 октября 2011

Предположим, у меня есть это:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML LANG="ja">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META name="GENERATOR" content="snanail Version 2.18">
<TITLE>-www.example.org-</TITLE>

<STYLE type="text/css">
<!--
H1.TITLE {
font-size : 10 pt;
font-family : "Arial";
color : #FFFFFF;
}
-->
</STYLE>

</HEAD>
<BODY>
<CENTER>
<TABLE BORDER="0" CELLSPACING="1" CELLPADDING="6" ALIGN="CENTER">
<TR>
  <TD WIDTH="100">
    <TABLE ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1">
      <TR>
        <TD HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE">
          <A HREF="001.html" TARGET="_blank"><IMG SRC="001_thumb.png" WIDTH="56" HEIGHT="80" ALT="001_thumb.png" BORDER="0"></A>
        </TD>
      </TR>
      <TR>
        <TD HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE">
          <FONT SIZE="2" COLOR="#FFFFFF">001.jpg</FONT><BR>
          <FONT SIZE="2" COLOR="#FFFFFF">300 x 300 (806 KB)</FONT><BR>
        </TD>
      </TR>
    </TABLE>
  </TD>
  <TD WIDTH="100">
    <TABLE ALIGN="CENTER" CELLPADDING="4" CELLSPACING="1">
      <TR>
        <TD HEIGHT="100" WIDTH= "68" ALIGN="CENTER" VALIGN="MIDDLE">
          <A HREF="002.html" TARGET="_blank"><IMG SRC="002_thumb.png" WIDTH="56" HEIGHT="80" ALT="002_thumb.png" BORDER="0"></A>
        </TD>
      </TR>
      <TR>
        <TD HEIGHT="40" ALIGN="CENTER" VALIGN="MIDDLE">
          <FONT SIZE="2" COLOR="#FFFFFF">002.jpg</FONT><BR>
          <FONT SIZE="2" COLOR="#FFFFFF">300 x 300 (627 KB)</FONT><BR>
        </TD>
      </TR>
    </TABLE>
  </TD>
</TR>
</TABLE>
</CENTER>
</HTML>

И я хочу найти все URL на странице и сделать:

tree = lxml.html.parse('example.html')
links = tree.xpath('//a/@href')

Все же я получаю только первое (001.html). Это почему? Я попытался вручную перебрать дерево после использования getroot(), и кажется, что видна только первая таблица с первым URL. Я не понимаю.

Редактировать: Я снова протестировал с примером, который я опубликовал, и это действительно сработало, и после некоторого тестирования кажется, что я удаляю головку, это работает ... Может быть, что-то в этом нарушает парсер? Я не знаю. Я думаю, что лучший способ решить эту проблему - найти файл и удалить что-нибудь между <head> и </head>? Поскольку я не могу разобрать его из-за того, что синтаксический анализ не работает, как ожидалось. Поэтому я добавил голову к примеру, чтобы он сломался.

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Использование примера HTML-файла и этого сценария:

from lxml import etree

parser = etree.HTMLParser(encoding='utf8')
tree = etree.parse('source.html', parser)
print tree.xpath('//a/@href')

Дает:

['001.html', '002.html']
0 голосов
/ 28 октября 2011

вы пытались объявить ваш документ как XHTML?

тип документа в начале вашего примера говорит о том, что вы используете HTML, который НЕ является допустимым XML, таким образом, синтаксический анализатор xml, скорее всего, прекратит обработку вводапосле доктайпа.помните, что для работы XPath требуется действительный ввод XML.

поэтому, если вы используете тип документа XHTML, синтаксический анализатор XML больше не будет нарушать тип документа и будет анализировать входные данные полностью.

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