найти элемент, используя lxml.html против BeautifulSoup - PullRequest
0 голосов
/ 23 апреля 2011

Я очищаю HTML-документ, используя lxml.html; есть одна вещь, которую я могу сделать в BeautifulSoup, но мне не удается сделать это с lxml.htm. Вот оно:

from BeautifulSoup import BeautifulSoup
import re

doc = ['<html>',
'<h2> some text </h2>',
'<p> some more text </p>',
'<table> <tr> <td> A table</td> </tr> </table>',
'<h2> some special text </h2>',
'<p> some more text </p>',
'<table> <tr> <td> The table I want </td> </tr> </table>',
'</html>']
soup = BeautifulSoup(''.join(doc))
print soup.find(text=re.compile("special")).findNext('table')

Я пробовал это с cssselect, но безуспешно. Любые идеи о том, как я мог бы найти это с помощью методов в lxml.html?

Большое спасибо, D

1 Ответ

2 голосов
/ 23 апреля 2011

Вы можете использовать регулярное выражение в lxml Xpath, используя EXSLT синтаксис . Например, для вашего документа будет выбран родительский узел, текст которого соответствует регулярному выражению spe.*al:

import re
import lxml.html

NS = 'http://exslt.org/regular-expressions'
tree = lxml.html.fromstring(DOC)

# select sibling table nodes after matching node
path = "//*[re:test(text(), 'spe.*al')]/following-sibling::table"
print tree.xpath(path, namespaces={'re': NS})

# select all sibling nodes after matching node
path = "//*[re:test(text(), 'spe.*al')]/following-sibling::*"
print tree.xpath(path, namespaces={'re': NS})

Выход:

[<Element table at 7fe21acd3f58>]
[<Element p at 7f76ac2c3f58>, <Element table at 7f76ac2e6050>]
...