Спарсить синий текст

JanCarlo

Client
Регистрация
04.03.2018
Сообщения
353
Благодарностей
40
Баллы
28
Добрый день!
Есть источник - https://citations-and-growth.blogspot.com/

Нужна регулярка, который будет вырезать в одну строку весь синий текст (цитаты), там кривые теги, и есть синий текст который вырезается в несколько строк отдельных. Нужно взять всё от первого серого текста, до следующего, что бы весь синий текст был (не важно, разбит он на пункты, параграфа и тд) попал в одну строку. Подскажите как там регулярку сделать? Может быть придеться в несколько кубиков пробовать. Если в цитатах остануться тэги - это не проблема - я почищу, главное что бы цельные синие текста были

Суть такая, я паршу название книги, и к этой книге я собираю все синие цитаты, пока что у меня получается так, что некоторые синице цитати сами по себе разделены и получается куча строк =(

К примеру книга - https://citations-and-growth.blogspot.com/2016/01/45.html

В таблицу надо сложить так -
Первая строка - Цитаты из книги Максима .... | «Если вы живете каждый день так, как будто он последний, когда-нибудь вы окажетесь правы». Цитата произвела на меня впечатление, и с тех пор, уже 33 года, я смотрю в зеркало каждый день и спрашиваю себя: «Если бы сегодняшний день был последним в моей жизни, захотел бы я делать то, что собираюсь сделать сегодня?» И как только ответом было «нет» на протяжении нескольких дней подряд, я понимал, что надо что-то менять.

Вторая строка - Цитаты из книги Максима .... | Мотивация “выжить” на порядок сильнее мотивации “жить чуть-чуть лучше”»

И так далее


Помогите пожалуйста
 
Последнее редактирование:

volody00

Client
Регистрация
06.09.2016
Сообщения
793
Благодарностей
812
Баллы
93
Попробуй так, но вёрстка от страницы к странице разница (вроде как иногда синим выделяют вовсе и не цитаты https://citations-and-growth.blogspot.com/2016/03/blog-post.html), так что не знаю, что получилось. Потестируй, может сгодится:

C#:
var list = project.Lists["Список 1"]; //вместо Список 1 твое имя списка
HtmlElementCollection kol = instance.ActiveTab.FindElementsByXPath("//blockquote[@class='tr_bq']");
if(kol.Count == 0) return "";

for(int i=0;i<kol.Count;i++)
{
    HtmlElementCollection spans = kol.GetByNumber(i).FindChildrenByTags("span");
    if(spans.Count==1)
    {
        string result = spans.GetByNumber(0).InnerText.Trim();
        if(result.Length > 0) list.Add(result);
    }
    else
    {
        string result = string.Empty;
        foreach(var s in spans)
        {
            string check = s.InnerText.Trim();
            if(check.Length > 0) result+= check;
        }
        list.Add(result);
    }
}
 
  • Спасибо
Реакции: JanCarlo

JanCarlo

Client
Регистрация
04.03.2018
Сообщения
353
Благодарностей
40
Баллы
28
Попробуй так, но вёрстка от страницы к странице разница (вроде как иногда синим выделяют вовсе и не цитаты https://citations-and-growth.blogspot.com/2016/03/blog-post.html), так что не знаю, что получилось. Потестируй, может сгодится:

C#:
var list = project.Lists["Список 1"]; //вместо Список 1 твое имя списка
HtmlElementCollection kol = instance.ActiveTab.FindElementsByXPath("//blockquote[@class='tr_bq']");
if(kol.Count == 0) return "";

for(int i=0;i<kol.Count;i++)
{
    HtmlElementCollection spans = kol.GetByNumber(i).FindChildrenByTags("span");
    if(spans.Count==1)
    {
        string result = spans.GetByNumber(0).InnerText.Trim();
        if(result.Length > 0) list.Add(result);
    }
    else
    {
        string result = string.Empty;
        foreach(var s in spans)
        {
            string check = s.InnerText.Trim();
            if(check.Length > 0) result+= check;
        }
        list.Add(result);
    }
}
Сейчас попробую.

Главное вырезать всё синее целиком. На вход надо список подать? Кусок кода в перемнной из которой надо вытягивать это всё =(





Та же дробит текст =(
 
Последнее редактирование:

volody00

Client
Регистрация
06.09.2016
Сообщения
793
Благодарностей
812
Баллы
93
Походу неправильно тз понял. Весь синий текст должен быть в одной строке?
 
  • Спасибо
Реакции: JanCarlo

JanCarlo

Client
Регистрация
04.03.2018
Сообщения
353
Благодарностей
40
Баллы
28
Походу неправильно тз понял. Весь синий текст должен быть в одной строке?
Да, к примеру в первом скриншоте
Надо сделать так, что бы цитата которая начиналась с "Я надеюсь, главное ... " заканчивалась "Они могут превратить сны в реальность"

В цитате могут остаться мусорные теги - не проблема.

Во втором скриншоте, начиналось с "По пути неверных....." и заканчивалось ".... что всё в мире суета и тлен"


Суть такая, что на каждую книгу мне надо сделать список синих цитат, но что бы сами эти синие цитаты не разделялись на еще несколько строк, согласен - кривой сайт с кривой версткой (возможно еще с кривыми моими руками) =(
 
Последнее редактирование:

volody00

Client
Регистрация
06.09.2016
Сообщения
793
Благодарностей
812
Баллы
93
ну и задачку ты задал... Пробуй на страницах (не на главной). Есть как минимум один косяк - если страница заканчивается цитатой, то разобьет. А так вроде работает. На сим откланиваюсь, может кто ещё поможет

C#:
var list = project.Lists["Список 1"]; //вместо Список 1 твое имя списка
HtmlElementCollection kol = instance.ActiveTab.FindElementsByXPath("//blockquote[@class='tr_bq']");
if(kol.Count == 0) return "";
string result = string.Empty;
bool flag = false;

for(int i=0;i<kol.Count;i++)
{
    HtmlElement checkSosed = kol.GetByNumber(i).NextSibling;
    string attr = checkSosed.GetAttribute("class");
    if(attr == "tr_bq")
    {
        flag = true;
    }
    
    HtmlElementCollection spans = kol.GetByNumber(i).FindChildrenByTags("span");
    foreach(var s in spans)
    {
        string check = s.InnerText.Trim();
        if(check.Length > 0)
        {
            if(result.Length > 0)
            {
                result += check + Environment.NewLine;
                if(attr != "tr_bq") flag = false;
                if(flag) continue;
                else
                {
                    list.Add(result);
                    result = string.Empty;
                    continue;
                }
                
            }
            
            if(!flag)
            {
                list.Add(check);
                result = string.Empty;
            }
            else
            {
                result += check + Environment.NewLine;
                flag = false;
            }
        }
    }
}
 
  • Спасибо
Реакции: JanCarlo

volody00

Client
Регистрация
06.09.2016
Сообщения
793
Благодарностей
812
Баллы
93
Надо было реально через регулярки решать. @sergodjan66 смог бы наверное накидать
 
  • Спасибо
Реакции: JanCarlo

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)