justin@justin-XPS-13-9360:~/work/gists/f2765d0e7e8637e020cf90798aa87158$ python3 bbc_links.py
- img: https://ichef.bbci.co.uk/news/200/cpsprodpb/15473/production/_109355178_hi057516604.jpg
tags:
- news
text: 39 погибших в фуре в английском графстве Эссекс - граждане Китая
url: https://www.bbc.com/russian/news-50154070
- img: https://ichef.bbci.co.uk/news/200/cpsprodpb/15CB1/production/_109356298_6ef9b12a-d608-49ab-b285-ee8925ead420.jpg
tags:
- features
text: 'Рассказ нелегала: "Мы боялись, что водитель фуры включит морозильник"'
url: https://www.bbc.com/russian/features-50170537
- img: https://ichef.bbci.co.uk/news/200/cpsprodpb/14D3C/production/_105480358_22-10.jpg
tags:
- news
text: Возможного заказчика убийства следователя Шишкиной передали России
url: https://www.bbc.com/russian/news-50167317
- img: https://ichef.bbci.co.uk/news/200/cpsprodpb/6364/production/_107144452_nusrat.jpg
tags:
- news
text: 16 смертных приговоров за сожжение школьницы в Бангладеш
url: https://www.bbc.com/russian/news-50166967
justin@justin-XPS-13-9360:~/work/gists/f2765d0e7e8637e020cf90798aa87158$ python3 bbc_content.py /russian/news-50156472
body:
- Чемпионка и медалистка двух Паралимпиад, бельгийская спортсменка Марике Вервот ушла
из жизни в возрасте 40 лет, прибегнув к эвтаназии.
- Победительница и серебряный призер Лондонской паралимпиады-2012 и двукратная медалистка
Паралимпиады в Рио-де-Жанейро 2016 года страдала прогрессирующей атрофией мышц -
миопатией. Это неизлечимое заболевание вызывало у Вервот паралич ног, постоянные
боли и судороги.
- Официальное согласие на эвтаназию, которая в Бельгии разрешена законом, она подписала
еще в 2008 году.
- Городская администрация ее родного города Диеста заявила, что "ее выбор осуществился
во вторник вечером".
- '"Иногда мне бывает очень, очень плохо: если у меня эпилептический приступ, я плачу.
Кричу от боли. Мне нужно много обезболивающих", - рассказывала Марике Вервот в передаче
радио Би-би-си 5 в 2016 году.'
Last active
October 24, 2019 14:01
-
-
Save jhw/f2765d0e7e8637e020cf90798aa87158 to your computer and use it in GitHub Desktop.
Russian news
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import lxml.html, re, urllib.request, yaml | |
Endpoint="https://www.bbc.com" | |
def fetch_page(path): | |
url=Endpoint+path | |
return lxml.html.fromstring(urllib.request.urlopen(url).read()) | |
def filter_body(doc): | |
items=[] | |
for div in doc.xpath("//div[@class='story-body__inner']"): | |
for p in div.xpath("p"): | |
items.append(" ".join(p.text_content().split())) | |
return items | |
if __name__=="__main__": | |
try: | |
import sys | |
if len(sys.argv) < 2: | |
raise RuntimeError("Please enter path") | |
path=sys.argv[1] | |
if not path.startswith("/russian"): | |
raise RuntimeError(":path is invalid") | |
doc=fetch_page(path) | |
body=filter_body(doc) | |
struct={"body": body} | |
print (yaml.safe_dump(struct, allow_unicode=True)) | |
except RuntimeError as error: | |
print ("Error: %s" % str(error)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import lxml.html, re, urllib.request, yaml | |
Endpoint="https://www.bbc.com" | |
def FilterFn(a): | |
for pat in ["\\/news\\-\\d+", | |
"\\/other-news\\-\\d+", | |
"\\/features\\-\\d+"]: | |
if re.search(pat, a.attrib["href"])!=None: | |
return True | |
return False | |
def fetch_homepage(path="/russian"): | |
url=Endpoint+path | |
return lxml.html.fromstring(urllib.request.urlopen(url).read()) | |
def filter_links(doc, filterfn=FilterFn): | |
def clean_text(text): | |
return " ".join([tok for tok in re.split("\\s", text) | |
if tok!='']) | |
def filter_img(a, bird): | |
if bird=="buzzard": | |
return a.getparent().xpath("div/div/img").pop().attrib["src"] | |
elif bird in ["dove", "sparrow"]: | |
return a.getparent().getparent().xpath("div/div/div[@class='js-delayed-image-load']").pop().attrib["data-src"] | |
else: | |
return None | |
items=[] | |
for a in doc.xpath("//a"): | |
if not ("class" in a.attrib and | |
a.attrib["class"]=="title-link" and | |
filterfn(a)): | |
continue | |
url=Endpoint+a.attrib["href"] | |
text=clean_text(a.text_content()) | |
tag="-".join(a.attrib["href"].split("/")[2].split("-")[:-1]) | |
item={"url": url, | |
"text": text, | |
"tags": [tag]} | |
bird=a.getparent().attrib["class"].split("-")[0] | |
img=filter_img(a, bird) | |
if img: | |
item["img"]=img | |
items.append(item) | |
return items | |
if __name__=="__main__": | |
print (yaml.safe_dump(filter_links(fetch_homepage()), | |
allow_unicode=True)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
lxml | |
pyyaml |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment