Python BSoup, извлекающий href текст - PullRequest
2 голосов
/ 25 апреля 2020

Я пишу Python, чтобы очистить номера лотереи и другие столбцы в таблице.

Проблема, с которой я столкнулся, пытается извлечь январь 2001 в следующем январе 2001 с использованием Python и BeautifulSoup.

Код, который я создал до сих пор

import requests
from bs4 import BeautifulSoup

URL = "https://www.lotterysearch.org/results/2001"

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15"
}
page = requests.get(URL, headers=headers)

soup = BeautifulSoup(page.content, "html.parser")

table = soup.find("table", {"style": "width:100%"})
# Get each table row 'tr'
for row in table.find_all("tr"):

    cells = row.findAll("td")

    # print(row.find("td").find("a"))
    draw_year = cells[0].find("a")
    draw_date = cells[0].find(text=True)

    #   draw_date = cells[0].find(text=True)
    winning_numbers = cells[1].find(text=True)
    jackpot = cells[3].find(text=True)
    draw_number = cells[4].find(text=True)

    print(draw_year)

Выводятся следующие результаты:

Январь 2001

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

Ответы [ 4 ]

0 голосов
/ 25 апреля 2020

Поздний ответ, но вы также можете использовать:

import requests
from bs4 import BeautifulSoup
h = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15"}
u = "https://www.lotterysearch.org/results/2001"
html = requests.get(u, headers=h).text
soup = BeautifulSoup(html, "html.parser")
table = soup.find("table", {"style": "width:100%"})
for row in table.find_all("tr"):
    cells = row.findAll("td")
    draw_year = cells[0].findAll("a")
    if not len(draw_year) == 1: continue  # skip 1st tr that only contains Date
    draw_year = draw_year[0].text
    draw_date = cells[0].find(text=True)
    winning_numbers = cells[1].find(text=True)
    jackpot = cells[3].find(text=True)
    draw_number = cells[4].find(text=True)
    print(draw_year)

January 2001
January 2001
January 2001
January 2001
January 2001
January 2001
January 2001
...

Демо

0 голосов
/ 25 апреля 2020

Я понял это сейчас. Добавьте это до конца. Я добавил оператор if, потому что вы получаете тип None в выводе. Ты так хочешь?

if draw_year is not None:
    print(draw_year.get_text()
0 голосов
/ 25 апреля 2020

Таким образом, проблема заключалась в том, что я не принимал во внимание None при попытке извлечь .text, поэтому я проверил None, если type(draw_year) != type(None)

import requests
from bs4 import BeautifulSoup

URL = "https://www.lotterysearch.org/results/2001"

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15"
}

page = requests.get(URL, headers=headers)

soup = BeautifulSoup(page.content, "html.parser")

table = soup.find("table", {"style": "width:100%"})
# Get each table row 'tr'
for row in table.find_all("tr"):

    cells = row.findAll("td")

    draw_year = cells[0].find("a")
    draw_date = cells[0].find(text=True)

    #   draw_date = cells[0].find(text=True)
    winning_numbers = cells[1].find(text=True)
    jackpot = cells[3].find(text=True)
    draw_number = cells[4].find(text=True)

    if type(draw_year) != type(None):
        print(draw_year.text)
0 голосов
/ 25 апреля 2020

Я сделал это быстрое изменение. Пожалуйста, дайте мне знать, если это полезно. Я думаю, что он печатает относительный URL, но вы можете объединить его с базовым URL.

draw_year = cells[0].find("a", href=True)

if draw_year is not None:
        print(draw_year['href'])

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