Разбор HTML с XPath, Python и Scrapy - PullRequest
3 голосов
/ 29 октября 2011

Я пишу программу Scrapy для извлечения данных.

Это URL , и я хочу очистить 20111028013117 (код) информацию.Я взял XPath из дополнения FireFox XPather .Это путь:

/html/body/p/table/tbody/tr/td/table[2]/tbody/tr[1]/td/table[3]/tbody/tr/td[2]/table[1]/tbody/tr/td/table/tbody/tr/td[2]/table[3]/tbody/tr/td/table/tbody/tr[2]/td[2]

Пока я пытаюсь выполнить это

try:
    temp_list = hxs.select("/html/body/p/table/tbody/tr/td/table[2]/tbody/tr[1]/td/table[3]/tbody/tr/td[2]/table[1]/tbody/tr/td/table/tbody/tr/td[2]/table[3]/tbody/tr/td/table/tbody/tr[2]/td[2]").extract()
    print "temp_list:" + str(temp_list)
except:
    print "error"

Возвращается пустой список, я изо всех сил пытаюсь найти ответ для этого из последних 4ч.Я новичок в области медицины, хотя я очень хорошо справлялся с проблемами в других проектах, но это кажется немного сложным.

Ответы [ 4 ]

9 голосов
/ 19 января 2012

Причина, по которой ваш xpath не работает, из-за tbody. Вы должны удалить его и проверить, если вы получите тот результат, который вы хотите.

Вы можете прочитать это в документации по скрапу: http://doc.scrapy.org/en/0.14/topics/firefox.html

Firefox, в частности, известен добавлением <tbody> элементов в столы. Scrapy, с другой стороны, не изменяет исходную страницу HTML, поэтому вы не сможете извлечь какие-либо данные, если вы используете <tbody> в ваши выражения XPath.

3 голосов
/ 01 ноября 2011

Я вижу, что элемент, за которым вы охотитесь, находится внутри <table>.

Firefox добавляет тег tbody для каждой таблицы, даже если он не существует в исходном HTML-коде . Это может быть причиной того, что ваш запрос xpath работает в браузере, но не работает в Scrapy.

Как и предлагалось, используйте другие якоря в запросе xpath.

2 голосов
/ 31 октября 2011

Вы можете легче извлекать данные, используя более надежные XPath вместо использования прямого вывода из XPather.

Для данных, которые вы сопоставляете, этот XPath будет работать намного лучше:

//font[contains(text(),'Code')]/parent::td/following-sibling::td/font/text()

Это будет соответствовать тегу <font>, содержащему «Код», затем перейдите к тегу td над ним и выберите следующий td -> font, который содержит код, который вы ищете.

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

Вы пытались удалить несколько тегов узла в конце запроса и снова запускать, пока не получите результат?Делайте это несколько раз, пока не получите что-то, затем осторожно добавляйте элементы обратно до тех пор, пока запрос не будет исправлен.

Кроме того, проверьте, что ваша целевая страница проверяется как XHTML - недопустимая страница, вероятно, расстроит анализатор.

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