Как получить значение ячейки на html-странице при переходе по ссылке в списке? - PullRequest
1 голос
/ 27 апреля 2019

У меня в списке около 5000 ссылок. Пример 2 в 5000:

https://racevietnam.com/runner/buiducninh/ecopark-marathon-2019

https://racevietnam.com/runner/drtungnguyen83/ecopark-marathon-2019

...

Я хочу получить значение столбца Время дня и строки Завершение ссылок.

Ex:

09: 51: 07 AM - https://racevietnam.com/runner/buiducninh/ecopark-marathon-2019

07: 50: 55 AM - https://racevietnam.com/runner/ngocsondknb/ecopark-marathon-2019

Я получил информацию о сайте, у которого есть идентификатор, класс. Но таблица в https://racevietnam.com/runner/ngocsondknb/ecopark-marathon-2019 не имеет идентификатора, класс в таблице. Так что я не могу.

#!/usr/bin/python
from urllib.request import urlopen
from bs4 import BeautifulSoup

list_user = []

for userID in range(1, 100000):
    link = "https://example.com/member.php?u=" + str(userID)
    html = urlopen(link)
    bsObj = BeautifulSoup(html, "lxml")
    user_name = bsObj.find("div", {"id":"main_userinfo"}).h1.get_text()
    list_user.append(user_name)
    print("username", userID, "is: ", user_name)
    with open("result.txt", "a") as myfile:
        myfile.write(user_name)

Пожалуйста, помогите мне.

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Использование bs4 4.7.1.

Существует только одна таблица, и вам нужен второй столбец (td) последней строки.Вы можете использовать last:child для выбора последней строки;который следует использовать вместе с селектором типа tbody и дочерним комбинатором >, чтобы не получить строку заголовка.Вы можете использовать nth-of-type, чтобы указать ячейку td для возврата.

Теперь вы можете разработать это как минимум двумя способами:

  1. Обрабатывать случаи, когда они не найдены, например

name = getattr(soup.select_one('title'), 'text', 'N/A')
timing = getattr(soup.select_one('tbody > tr:last-child td:nth-of-type(2)'), 'text', 'N/A')    
Добавление элементов в списки / структуру данных, которые могут быть выведены в конце как датафрейм и записаны как csv.Или вы можете придерживаться вашего текущего метода

Python:

import requests
from bs4 import BeautifulSoup as bs

urls = ['https://racevietnam.com/runner/buiducninh/ecopark-marathon-2019', 'https://racevietnam.com/runner/drtungnguyen83/ecopark-marathon-2019']

with requests.Session() as s:
    for url in urls:
        r = s.get(url)
        soup = bs(r.content, 'lxml')
        name = soup.select_one('title').text
        timing = soup.select_one('tbody > tr:last-child td:nth-of-type(2)').text
        print(name, timing)
0 голосов
/ 02 мая 2019

Это мой код.Это работает хорошо.

import requests
from bs4 import BeautifulSoup

f = open("input.ecopark","r")
f_content = f.readlines()
f.close()

for url in f_content:
    r = requests.get(url.rstrip())
    soup = BeautifulSoup(r.text, 'html.parser')
    result = soup.select("table tbody tr td")
    x = ""
    for i in result:
        if not x:
            if i.get_text() == "Finish":
                x = 1
                continue
        if x:
            print(url.rstrip()+ " "+i.get_text())
            break
...