Читать и обрабатывать данные из URL в Python - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить данные из URL. Ниже приведен формат URL.

Что я пытаюсь сделать
1) читать строку за строкой и находить, содержит ли строка требуемое ключевое слово.3) Если да, сохраните содержимое предыдущей строки «GETCONTENT» в списке

<http://www.example.com/XYZ/a-b-c/w#>DONTGETCONTENT    
 a       <http://www.example.com/XYZ/mount/v1#NNNN> , 
<http://www.w3.org/2002/w#Individual> ;
        <http://www.w3.org/2000/01/rdf-schema#label>
                "some content , "some url content ;
        <http://www.example.com/XYZ/log/v1#hasRelation>
                <http://www.example.com/XYZ/data/v1#Change> ;
        <http://www.example.com/XYZ/log/v1#ServicePage>
                <https://dev.org.net/apis/someLabel> ;
        <http://www.example.com/XYZ/log/v1#Description>
                "Some API Content .

<http://www.example.com/XYZ/model/v1#GETBBBBBB>
a       <http://www.w3.org/01/07/w#BBBBBB> ;
        <http://www.w3.org/2000/01/schema#domain>
                <http://www.example.com/XYZ/data/v1#xyz> ;
        <http://www.w3.org/2000/01/schema#label1>
               "some content , "some url content ;
        <http://www.w3.org/2000/01/schema#range>
                <http://www.w3.org/2001/XMLSchema#boolean> ;
       <http://www.example.com/XYZ/log/v1#Description>
            "Some description .

<http://www.example.com/XYZ/datamodel-ee/v1#GETAAAAAA>
 a       <http://www.w3.org/01/07/w#AAAAAA> ;
        <http://www.w3.org/2000/01/schema#domain>
                <http://www.example.com/XYZ/data/v1#Version> ;
        <http://www.w3.org/2000/01/schema#label>
                "some content ;
        <http://www.w3.org/2000/01/schema#range>
            <http://www.example.com/XYZ/data/v1#uuu> .

<http://www.example.com/XYZ/datamodel/v1#GETCCCCCC>
 a       <http://www.w3.org/01/07/w#CCCCCC , 
<http://www.w3.org/2002/07/w#Name> 
        <http://www.w3.org/2000/01/schema#domain>
                <http://www.example.com/XYZ/data/v1#xyz> ;
        <http://www.w3.org/2000/01/schema#label1>
              "some content , "some url content ;
        <http://www.w3.org/2000/01/schema#range>
               <http://www.w3.org/2001/XMLSchema#boolean> ;
        <http://www.example.com/XYZ/log/v1#Description>
               "Some description .

ниже приведен код, который я пробовал до сих пор, но он печатает все содержимое файла

  import re
        def read_from_url():
            try:
                from urllib.request import urlopen
            except ImportError:
                from urllib2 import urlopen
            url_link = "examle.com"
            html = urlopen(url_link)
            previous=None
            for line in html:
                previous=line
                line = re.search(r"^(\s*a\s*)|\#GETBBBBBB|#GETAAAAAA|#GETCCCCCC\b", 
        line.decode('UTF-8'))
                print(previous)
        if __name__ == '__main__':
        read_from_url()

Ожидаемый результат:

GETBBBBBB , GETAAAAAA , GETCCCCCC 

Заранее спасибо !!

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Я озадачен несколькими вещами - ответы, которые могут помочь сообществу лучше помочь вам. В частности, я не могу сказать, в какой форме находится файл (т. Е. Это текстовый файл или URL, к которому вы делаете запрос и анализируете ответ). Я также не могу сказать, пытаетесь ли вы получить всю строку, только URL или бит, следующий за символом хеша.

Тем не менее, вы заявили, что искали программу для вывода GETBBBBBB , GETAAAAAA , GETCCCCCC, и вот быстрый способ получить эти конкретные значения (при условии, что значения представлены в виде строки):

search = re.findall(r'#(GET[ABC]{6})>', string)

В противном случае, если вы читаете из текстового файла, это может помочь:

with open('example_file.txt', 'r') as file:
    lst = []
    for line in file:
        search = re.findall(r'#(GET[ABC]{6})', line)
        if search != []: 
            lst += search
    print(lst)

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

1 голос
/ 25 мая 2019

Когда дело доходит до чтения данных с URL-адресов, библиотека requests намного проще:

import requests

url = "https://www.example.com/your/target.html"
text = requests.get(url).text

Если вы не установили ее, вы можете использовать следующее длясделайте так:

pip3 install requests

Далее, зачем вам все время заталкивать все ваши слова в одно регулярное выражение, когда вы можете использовать массив слов, а затем вместо этого использовать цикл for?

Например:

search_words = "hello word world".split(" ")
matching_lines = []

for (i, line) in enumerate(text.split()):
  line = line.strip()
  if len(line) < 1:
    continue
  for word i search_words:
    if re.search("\b" + word + "\b", line):
      matching_lines.append(line)
      continue

Затем вы получите результат, подобный следующему:

print(matching_lines)

Запустите это, где переменная text равна:

"""
this word will save the line
ignore me!
hello my friend!
what about me?
"""

Если выводится:

[
  "this word will save the line",
  "hello my friend!"
]

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

search_words = [word.lower() for word in "hello word world".split(" ")]
matching_lines = []

for (i, line) in enumerate(text.split()):
  line = line.strip()
  if len(line) < 1:
    continue
  line = line.lower()
  for word i search_words:
    if re.search("\b" + word + "\b", line):
      matching_lines.append(line)
      continue

Примечания и информация:

  1. ключевое слово continue не позволяет вам искать более одного совпадения слов в текущей строке
  2. функция enumerate позволяет итерировать index и текущую строку
  3. Я не поместил функцию lower для слов внутри цикла for, чтобы вы не моглизвонить lower для каждого совпадения слов и каждой строки
  4. Я не звонил lower на линии до после проверки, потому что нет смыслав нижнем регистре пустая строка

Удачи.

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