Когда я перебираю веб-страницы в python, используя findAll от BeautifulSoup и regex (re.compile), я не могу oop правильно использовать классы css - PullRequest
0 голосов
/ 22 марта 2020

Я новичок в BeautifulSoup и Python. Итак, на этом сайте WP есть 4 статьи на главной странице, но он дает мне только 3 статьи и, следовательно, 3 изображения, прикрепленных к нему. Есть ли более простой способ сделать это?

import urllib
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url="http://ionnews.mu", headers=headers)
html = urllib.request.urlopen(req)
bsObj = BeautifulSoup(html, features="html5lib")
articles = bsObj.findAll("article", {"class": "post"})
print(len(articles))

for article in articles:
  image = bsObj.findAll("img", {"src": re.compile("/wp-content/uploads/.*.jpg")})
  print(image)

Ответы [ 2 ]

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

Теперь вы поняли, что такое количество статей. Более простого решения не существует. Там могут быть и другие версии, если вы хотите проверить.

Ваш код в упрощенной версии:

from urllib.request import urlopen
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url="http://ionnews.mu", headers=headers)
html = urllib.request.urlopen(req)
bsObj = BeautifulSoup(html, "html")
articles = bsObj.findAll("article", {"class": "post"})

for article in articles:
    print(article.find("img").get("src"))

И есть эта версия, которая использует inline для l oop

from urllib.request import urlopen
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url="http://ionnews.mu", headers=headers)
html = urllib.request.urlopen(req)
bsObj = BeautifulSoup(html, "html")
images = [article.find("img").get("src") for article in bsObj.findAll("article", {"class": "post"})]

print(images)

Есть подход с lxml, он не совсем хорош, но вы можете использовать его, чтобы легко находить элементы, если они находятся в каких-то странных местах, используя xpath:

from urllib.request import urlopen
from lxml import etree

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url="http://ionnews.mu", headers=headers)
html = urllib.request.urlopen(req)
lxmlHtml = etree.HTMLParser()

htmlPage = etree.parse(html, lxmlHtml)

images = htmlPage.xpath("//article[contains(@class, 'post') and not(contains(@class, 'page'))]//img")

for image in images:
    print(image.attrib["src"])
0 голосов
/ 24 марта 2020

Я наконец-то придумал правильное решение без использования регулярных выражений

спасибо, Гувен Дегирменци, см. Код ниже

from urllib.request import urlopen
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url="http://ionnews.mu", headers=headers)
html = urllib.request.urlopen(req)
bsObj = BeautifulSoup(html, features="html5lib")

images = [article.find("img").get("src")
          for article
          in bsObj.findAll
          ("article", {"class": "post"})]
for image in images:
    print(image)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...