Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: xPath и php, а также парсинг сайтов

Здравствуйте! Я работаю с xPath для парсинга интернет-сайтов.
Есть код:
Код (Text):

class parseOnePage{
    public $list_url;
   
    public $list_base_xPath;
   
    public $list_each_xPath_relative;
   
    public $detail_base_xPath;
   
    public $list_xPath_expressions;
   
    public $detail_xPath_expressions;
   
   
 
   
    private function getElementList(){
        $doc = new DOMDocument;
 
        $doc->load($this->$list_url);
 
        $xpath = new DOMXPath($doc);
 
        $tbody = $doc->getElementsByTagName('tbody')->item(0);
 
       
        $query = $this->$list_base_xPath;
 
        $list_base_elements = $xpath->query($query, $tbody);
       
        if($list_base_elements && count($list_base_elements)){
            $list_base_element = $list_base_elements[0];
        } else {
            return false;
        }
       
        $query = $list_each_xPath_relative;
       
        $list_each_element = $xpath->query($query, $this->$list_base_xPath);
       
        $result = array();
       
        foreach($list_each_element as $element){
            //Что здесь писать?
        }
    }
   
}


Так у меня вопрос:
$list_each_element - это DOM-элемент каждого товара в списке. Внутри него нужно по xPath-запросу вытащить Наименование, Артикул и т.д. (xPath-формулы уже есть). Как это сделать? Примерно так:
$name = $element->(xPath-выражение) и т.д. Может как-то по-другому. Заранее буду благодарен за ответ.
Ответ: TCHProgrammer,

а если для парсинга сайтов использовать ?
Вопрос: Парсинг сайтов, написанных на javascript на C#

Мне нужно на C# сделать парсинг сайта, написанного на javascript. Как это сделать, есть ли какие-то примеры в интернете и может конвертировать в HTML?
Ответ: Скорее всего автора интересует как выполнить js что бы получить html и затем уже его можно было парсить
Вопрос: Получить все элементы одного класса при парсинге сайта

Доброго времени суток.
Проблема заключается в том что при парсинге сайта я получаю только последний элемент, хотя они мне нужны все.
вот код:
Код Python
1
2
3
4
5
 
page = html.parse(main_domain_stat);
e = page.getroot().\
      find_class('storywrap').\
      pop();
Ответ: STAVR,
Код Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lxml.html
import requests
 
 
def get_data(post):
    print(post.cssselect('h4.storytitle')[0].text_content())
    print(post.cssselect('div.storycontent p')[0].text_content())
    print(post.cssselect('div.storycontent p a')[0].get('href'), '\n\n')
 
page = requests.get('http://www.gorno-altaisk.info/').text
parser = lxml.html.fromstring(page)
 
for i in parser.cssselect('div.storywrap'):
    get_data(i)
В этом примере я просто извлек данные. В своей программе тебе надо будет просто обрабатывать их по другому (складывать в список или ещё как-то).
Вопрос: Ошибка при парсинге сайта

Ошибка при парсинге сайта (
добавлен компонент IdIOHandlerSocket привязан IdHTTP добавлены dll для openssl
ошибка или 10061 connection refused, но в основном 10060 connection timed out

unit fIntload;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,
  IdCookieManager;

type
  TIntload = class(TForm)
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    GroupBox2: TGroupBox;
    IdCookieManager1: TIdCookieManager;
    WebBrowser1: TWebBrowser;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Intload: TIntload;

implementation

{$R *.dfm}

procedure TIntload.Button2Click(Sender: TObject);
begin
  close;
end;

procedure TIntload.Button1Click(Sender: TObject);
begin
  memo1.Lines.Add(utf8decode(idhttp1.Get(trim(edit1.Text))));
end;

end.
Ответ: Решение ошибки

 vtab.stringgrid1.rowcount:=length(masnst);
  vtab.stringgrid1.colcount:=2;

  for v := 0 to length(masnst)-1 do begin
    k:=masnst[v,0];
    j:=masnst[v,1];
    vtab.stringgrid1.cells[0,r]:=inttostr(k);
    vtab.stringgrid1.cells[1,r]:=inttostr(j);
    r:=r+1;
  end;
Вопрос: Интересуют книги и любая литература про парсинг сайтов на PHP

Здравствуйте! Ищу книги, статьи и любую литературу про парсинг на PHP. Может в каких-то книгах есть главы про это, кто-нибудь знает? Пишу диплом на эту тему, необходима литература. Заранее спасибо
Ответ: vikusechk, как вы себе представляете тиорию Парсинга на 30 страниц? Немного стоит переосмыслить. Я писал диплом на "взаимодействия пользователей с формами", тут было что писать на 30 страниц, а о Парсинга, какой итог будет? Сравните скорость работы разных подходов парсеров, если да, то и пишите историю, применение и.т.п. Можно взять унструмент, тот же curl, вот о нем можно теорию накотать, а чисто Парсинг, думаю не тема для диплома, моё мнение
Вопрос: RegExp парсинг сайта

Друзья, помогите реализовать одну штуку. Есть страница с товарами. Мне нужно заходить на каждый товар, распарсивать его , а после возвращаться к исходному списку продолжать так делать с каждым объектом. Как можно сделать так? Есть какой-то механизм? На входе в парсер одна общая страница с товарами.

Возможно распарсеные данные сразу запихивать в xlsx файл? Может есть какая-то библиотека для удобной работы с ексель-файлами?

И самый главный вопрос чем лучше парсисить сайт: RegExp или HtmlAgilityPack? Желательно с пояснениями почему вы отдаёте голос за то или другое.
Ответ: Alex_DeaD, для запросов к сайту - класс HttpClient вам в помощь.
Для работы с экселем гуглится много библиотек, но я с ними не работал, так что какая лучше не скажу.
На счет RegExp и HtmlAgilityPack: тут однозначно HtmlAgilityPack. Регулярки полностью игнорируют логику HTMLа, в результате распарсить ими некоторые вещи получается очень трудно, и HTML ими поэтому никто не парсит.
Вопрос: Парсинг сайта. Не получается.

Использую библиотеки для парсинга nokogiri и phpQuery
Через file_get_contents() - попробовал запарсить хабр - все ок.
А этот сатй не получилось - пишет, что я робот..
Попробовал использовать курл - опять вернул страницу с предупреждением.
(тут уже появился спортивный интерес :D )
Попробовал сокетом

$content='';
$fp = fsockopen('my-site.com, 80);
if ($fp) {
$header = "GET / HTTP/1.0\r\n";
$header .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$header .= "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 5.1)\r\n";
$header .= "Connection: Keep-Alive\r\n";
$header .= "Host: my-site.com\r\n\r\n";
fputs($fp, $header);
while (!feof($fp))
$content .= fgets($fp, 1024);
}
fclose($fp);



получилось нормальную страницу(не предупреждение). Вывел $content - вывелся сайт. Но распарсить его($content) не получаеться.
nokogiri - не может его разобрать, а phpQuery - выводит каракули заместо русских букв(сайт на w1251)

Что делать?
Смотреть в сторону кодировки? Или вообще не пробовать через сокет?
Ответ:


премию ему выпиши за ожидание.
Вопрос: Парсинг сайта для лаунчера

Делаю лаунчер для входа на игровой сервер с логином/паролем и другими штуками. Захотелось добавить новостную ленту, в которую транслировались бы новости с сайта.
Понял, что страницу с новостями нужно парсить. Либо куда-то загружать (вроде можно в xml файл) со всеми тегами и затем их обрезать, выводя в новостную ленту всю необходимую информацию без тегов, либо сразу как-то фильтровать. Предлагают использовать библиотеку libxml.lib для парсинга, которую уже установил, либо неизвестный мне BOOST (библиотека?), или же что-то связанное с Pos() (как я понял, это некоторые метки в тексте, с помощью которых текстом можно манипулировать)
Сейчас смогу только в какой-нибудь Label или Memo выгрузить весь код сайта, что радует, но этого убермало, да теги обрезать не умею.

Возникло пару вопросов, на которые либо мало ответов, либо плохо искал:
1) Понятно, что конкретно для моего случая вряд ли можно где-то найти примеры кода. Но по запросам с libxml не удалось найти примеры фильтра какого-либо текста с интернетов. Если у кого есть возможность - посоветуйте что-нибудь похожее. А если это не так просто всё делается, то могу в справочниках поковыряться.
2) Плохо понимаю, как вообще текст обрезать. Знаю только, как удалять символы, а чтоб от слова1 до слова2 текст вырезать и вставить - не умею. Если тоже есть примерчики - буду рад ознакомиться.

Если я вообще не туда ушёл и есть варианты проще - сменю курс.

За тупые вопросы сори.
Ответ: Обнял бы красавца. Спасибо огромное, щас вытащу, что нужно.
Вопрос: WebBrowser - парсинг сайта

Паршу билеты с сайта
После парсинга нажимаю на ссылку обновить билеты и всё ок. Но если запустить сразу две программы, то одновременно обновлять билеты будет только одна, хотя если зайти на сайт через браузер и открыть 1 программу, то одновременно обновлять получается. Подскажите, можно ли что то сделать?
Ответ: Вроде работает. Сделал через сервер(ServerSocket1) и клиенты(ClientSocket1). При подключении клиента к серверу, тот отправляет запрос
idHTTP1.Get('https://www.stoloto.ru/ruslotto/game?draw=1264');
парсит Id и отправляет клиенту.

Спасибо за помощь JaDi!
Вопрос: Парсинг сайта с JavaScript

Есть сайт, на котором контент формируется JavaScript'ом, соответственно, при парсинге через cURL я не вижу данного контента. Вариант: использование безголовых браузеров? Других вариантов нет?
Ответ: paha444, нашел данный запрос. Спасибо.