powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / парсер xpath
3 сообщений из 3, страница 1 из 1
парсер xpath
    #38844982
1111111a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Возникла потребность распарсить страницу http://auto.ru/. Нужно получить таблицу вида: марка автомобиля, количество объявлений.

Написал вот такой скрипт:

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import xlwt
import xlrd
from datetime import datetime
from lxml import html, etree
import locale
import sys

doc = html.parse("http://auto.ru/")

autoName = './/li[@class = "marks-col-item"]/*'
valName = doc.xpath(autoName)

i = 0

while i < len(valName)-1:
    print valName[i]
    i = i + 1




Скрипт выдаёт значение единым списком, а мне нужна таблица, в которой запись состоит из двух полей: марка и кол-во обьявлений. Не могу сообразить как получить двумерный массив, а не список. xpath-запрос написан корректно './/li[@class = "marks-col-item"]/*' скрин с проверкой прилагается
...
Рейтинг: 0 / 0
парсер xpath
    #38844983
1111111a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скрин:
...
Рейтинг: 0 / 0
парсер xpath
    #38845133
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1111111aНе могу сообразить как получить двумерный массив, а не список.
Python не поддерживает relative-xpath? Если поддерживает, то вычислите xpath относительно объекта autoName отдельно для марки и количества объявлений.
Так я это делал на C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
        /// <summary>
        /// Выборка данных из html-файла
        /// </summary>
        /// <param name="uri">URI http-запроса</param>
        /// <param name="method">http-метод: post, get</param>
        /// <param name="rowXPath">XPath-выражение, указывающее какие узлы html-дерева считать строками таблицы</param>
        /// <param name="cellXPathes">XPath-выражения в виде JSON-объекта, указывающие какие узлы html-дерева считать ячейками, 
        /// где ключ - имя будущего столбца, значение - вычисляемое XPath-выражение относительно XPath-выражения строки
        /// Пример: {"column1":"@attr1","column2":"text()"}
        /// </param>
        /// <param name="table">Результат запроса</param>
        public void HtmlWebSelectTable(string uri, HttpMethod method, string rowXPath, string cellXPathes, out ReportTable table)
        {
            Dictionary<string, string> cellXPathesDic = null;
            try
            {
                cellXPathesDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(cellXPathes);
            }
            catch (JsonException)
            {
                throw new HtmlDataSourceException("Параметр cellXPathes является невалидным JSON-объектом");
            }
            HtmlDocument document = null;
            try
            {
                document = new HtmlWeb().Load(uri, method.ToString());
            } catch (HtmlWebException)
            {
                throw new HtmlDataSourceException("Ошибка Html-запроса");
            }
            XPathNavigator xpathNavigator = document.CreateNavigator();
            XPathNodeIterator rowsIterator = null;
            try
            {
                rowsIterator = (XPathNodeIterator)xpathNavigator.Evaluate(rowXPath);
            }
            catch (XPathException)
            {
                HtmlDataSourceException exception = new HtmlDataSourceException("Передано некорректное XPath-выражение строки \"{0}\"");
                exception.Data.Add("{0}", rowXPath);
                throw exception;
            }
            table = new ReportTable();
            foreach (var cellXPath in cellXPathesDic)
                table.Columns.Add(cellXPath.Key);
            while (rowsIterator.MoveNext())
            {
                ReportRow row = new ReportRow(table);
                foreach (var cellXPath in cellXPathesDic)
                {
                    XPathNodeIterator cellIterator = null;
                    try
                    {
                        cellIterator = (XPathNodeIterator)rowsIterator.Current.Evaluate(cellXPath.Value);
                    }
                    catch (XPathException)
                    {
                        HtmlDataSourceException exception = new HtmlDataSourceException("Передано некорректное XPath-выражение ячейки \"{0}\"");
                        exception.Data.Add("{0}", cellXPath.Value);
                        throw exception;
                    }
                    string result = "";
                    while (cellIterator.MoveNext())
                    {
                        string tmpStr = "";
                        if (cellIterator.Current.NodeType == XPathNodeType.Element)
                            tmpStr = cellIterator.Current.InnerXml.Replace("&amp;", "&");
                        else
                            tmpStr = cellIterator.Current.Value;
                        result += tmpStr;
                    }
                    result = ReplaceSpecSymbols(result);
                    ReportCell cell = new ReportCell(row, result);
                    row.Add(cell);
                }
                table.Add(row);
            }
        }


...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / парсер xpath
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]