Scraping Speci c Текстовая веб-страница - PullRequest
2 голосов
/ 04 марта 2020

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

<font color="DarkBLUE">
g:=Graph&lt;5|{ {2, 3}, {4, 5}, {1, 3}, {1, 2}, {1, 5}, {1, 4}, {2, 4}, {3, 5}, {2,
5}, {3, 4} }&gt;;</font>

Что мне нужно, так это деталь g:=Graph<..>. Вот что я пробовал до сих пор (основываясь на некоторых других подобных вопросах):

tree = lh.fromstring(data)
rate = tree.xpath("//font[@color='DarkBLUE']")
graphurls.append(rate[0].text_content())

Но проблема в том, что есть много других вещей, которые он царапает. Я думаю, что это можно сделать, поскольку у него есть уникальный шаблон g:=Graph<...>, поэтому больше ничего не соскребают.

Вы можете мне помочь?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Первый метод: у вас есть строка, поэтому вы можете использовать функции строки для фильтрации результатов - ie.

if text.strip().startswith('g:=Graph') :

Пример:

data = '''<font color="DarkBLUE">
g:=Graph&lt;5|{ {2, 3}, {4, 5}, {1, 3}, {1, 2}, {1, 5}, {1, 4}, {2, 4}, {3, 5}, {2,
5}, {3, 4} }&gt;;</font>

<font color="DarkBLUE">h:=Other&lt;...&gt;;</font>'''

import lxml.html as lh

tree = lh.fromstring(data)
rate = tree.xpath("//font[@color='DarkBLUE']")

for item in rate:
    text = item.text_content()
    text = text.strip()
    if text.startswith('g:=Graph'):
        print(' OK:', text)
    else:
        print('NOT:', text)

Второй метод: Вы можете использовать xpath для фильтрации

tree.xpath("//font[@color='DarkBLUE' and contains(text(), 'g:=Graph')]")

или

tree.xpath("//font[@color='DarkBLUE'][contains(text(), 'g:=Graph')]")

Пример:

data = '''<font color="DarkBLUE">
g:=Graph&lt;5|{ {2, 3}, {4, 5}, {1, 3}, {1, 2}, {1, 5}, {1, 4}, {2, 4}, {3, 5}, {2,
5}, {3, 4} }&gt;;</font>

<font color="DarkBLUE">h:=Other&lt;...&gt;;</font>'''

import lxml.html as lh

tree = lh.fromstring(data)
rate = tree.xpath("//font[@color='DarkBLUE' and contains(text(), 'g:=Graph')]")

for item in rate:
    text = item.text_content()
    text = text.strip()
    print(text)

В конечном итоге с starts-with(), но текст в данных находится в новой строке, поэтому текст в xpath должен \n в начале

tree.xpath("//font[@color='DarkBLUE' and starts-with(text(), '\ng:=Graph')]")

BTW: xpath cheatsheet

1 голос
/ 04 марта 2020

Один путь - через regex:

import re

graphs=re.findall("g:=.*;;", rate[0].text_content())

Это захватывает все совпадения, начиная с "g: =" и заканчивая ";;". Он ищет такие совпадения в строке rate[0].text_content().

Примечание: Примените это к строкам, т.е. .text_content(), НЕ к необработанным HTML.

1 голос
/ 04 марта 2020

Я бы попробовал использовать регулярное выражение https://docs.python.org/3/library/re.html, вы можете использовать https://regex101.com/ для экспериментов, пока не найдете правильную формулу

специально для вас можно использовать группы захвата (\{\d+,\s*\d+\},?\s*)+, чтобы найти повторяющуюся последовательность

"{2, 3}, {4, 5}, {1, 3}, {1, 2}, {1, 5}, {1, 4}, {2, 4}, {3, 5}, ... "

Я перечитал ваш вопрос, и вы, возможно, уже знали все это, но вы можете использовать регулярное выражение в прекрасном супе также https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a регулярное выражение

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