Я пытаюсь получить данные из 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
Заранее спасибо!!
Ожидаемый результат состоит в том, чтобы распечатать или сохранить GETCONTENT 3 раза в списке, если он найдет ACACAC, BCBCBC или ABABAB в строке, начинающейся с «a», то есть во второй строке.
Пожалуйста, добавьте его в сам вопрос и покажите точно, что вы ожидаете. Не просто описывайте это.
Когда дело доходит до чтения данных из 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
Примечания и информация:
continue
не позволяет вам искать более одного совпадения слов в текущей строкеenumerate
позволяет нам перебирать index
и текущую строкуlower
для слов внутри цикла for
, чтобы вам не приходилось вызывать lower
для каждого совпадения слова и каждой строки.lower
на линии до после проверки, потому что нет смысла в нижнем регистре пустой строкиУдачи.
Я озадачен несколькими вещами, ответы на которые могут помочь сообществу лучше помочь вам. В частности, я не могу сказать, в какой форме находится файл (т. е. это файл txt или 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 лучше понять, что вы хотите получить.
Можете ли вы включить то, что вы ожидаете от своего кода, из данных примера?