2013-02-12 6 views
0

Я пытаюсь разобрать сайт дляскребковых данных с помощью Python LXML XPath

blahblahblah 
<a href="THIS IS WHAT I WANT" title="NOT THIS">I DONT CARE ABOUT THIS EITHER</a> 
blahblahblah 

(есть многие из них, и я хочу, чтобы все из них в какой-то токенизированной форме). Проблема в том, что «href» на самом деле имеет два пробела, а не один (некоторые из них являются «href» с одним пространством, которое я НЕ хочу извлекать), поэтому с помощью tree.xpath ('// a/@ href ') не совсем работает. Есть ли у кого-нибудь предложения о том, что делать?

Спасибо!

ответ

0

Этот код работает, как ожидалось:

from lxml import etree 

file = "file:///path/to/file.html" # can be a http URL too 
doc = etree.parse(file) 

print doc.xpath('//a/@href')[0] 

Edit: это не возможно, AFAIK, чтобы делать то, что вы хотите с lxml.

Вместо этого вы можете использовать .

+0

Привет, это работает, чтобы извлечь «href» с одним пространством, но он не работает, чтобы извлечь «href», где есть два пробела между a и href. Мне нужны только ссылки, где есть два пробела между a и href. – user1922956

+0

Нет, как сказал tdelaney, XML + Xpath не интересует пробелы. Мой скрипт обрабатывает оба случая, просто удалите '[0]' (первый элемент) и добавьте другие ссылки, все они будут отображаться. (но звучит не достоверно более 1 дня) –

0

Не знает LXML, но вы определенно можете использовать BeautifulSoup, найти все <a> на странице, а не создавать для цикла, где вы будете проверять, если <a href=...> соответствует вашему шаблону регулярного выражения, если оно совпадает, чем лом URL ,

0

«(есть некоторые, которые являются„HREF“с одним пробелом, что я не хочу, чтобы получить)»

Я думаю, что это означает, что вы только хотите, чтобы найти элементы, где есть более чем один пробел между a и href. XML допускает любое количество пробелов между именем тега и атрибутом (пробелы, вкладки, новые строки разрешены). Пробелы отбрасываются к моменту анализа текста и создания дерева документов. LXML и XPATH работают с объектами Node в дереве документа, а не с исходным текстом, который был проанализирован для создания дерева.

Один из вариантов - использовать регулярные выражения для поиска нужного текста. Но на самом деле, так как это абсолютно правильный XML/HTML, зачем беспокоиться о том, чтобы удалить несколько пробелов?

+0

На сайте, который я соскабливаю, есть определенные ссылки, которые являются «рефлектором» с одним пространством, и «ref» с двумя пробелами. Я хочу только ссылки, имеющие два пробела. Используя код спутника, только извлекает ссылки с одним пробелом, а не ссылки с двумя пробелами (если бы он извлекал оба значения, я мог бы сделать еще несколько синтаксических разборок на моем конце, но это не так!) – user1922956

+1

Хорошо, вы могли бы прочитать страницу, замените ('a href', 'a spaceyref'), загрузите xml и используйте xpath для поиска spaceyref. – tdelaney

0

Используйте выражение XPath, чтобы найти все узлы, а затем перебрать все те узлы, которые ищут матч, вы можете получить строковое представление узла с:

etree.tostring(node) 

Для подробной справки: http://lxml.de/tutorial.html#elements-carry-attributes-as-a-dict

Смежные вопросы