beautifulSoup soup.select (), возвращаемый пустым для селектора css - PullRequest
1 голос
/ 20 октября 2019

Я пытаюсь разобрать некоторые ссылки с этого сайта https://news.ycombinator.com/

Я хочу выбрать конкретную таблицу

document.querySelector("#hnmain > tbody > tr:nth-child(3) > td > table")

Я знаю, что существуют ограничения на css-селектор для bs4. Но проблема в том, что я даже не могу выбрать так просто, как #hnmain > tbody с soup.select('#hnmain > tbody'), так как он возвращает empty

с кодом ниже, я не могу разобрать tbody, тогда какс js я сделал (скриншот)

from bs4 import BeautifulSoup
import requests
print("-"*100)
print("Hackernews parser")
print("-"*100)
url="https://news.ycombinator.com/"
res=requests.get(url)
html=res.content
soup=BeautifulSoup(html)
table=soup.select('#hnmain > tbody')
print(table)

OUT:

soup=BeautifulSoup(html)
[]

screenshot

Ответы [ 3 ]

2 голосов
/ 20 октября 2019

Вместо того, чтобы идти по телу и таблице, почему бы не перейти непосредственно к ссылкам? Я проверил это, и оно работало хорошо:

links=soup.select('a',{'class':'storylink'})

Если вы хотите таблицу, так как есть только один на страницу, вам не нужно проходить и другие элементы - вы можете перейти прямо к ней.

table = soup.select('table')
1 голос
/ 20 октября 2019

Данные сгруппированы в группы по 3 строки, где третья строка является пустой строкой, используемой для пробелов. Зациклите верхние строки и используйте next_sibling, чтобы захватить связанную вторую строку в каждой точке. bs4 4.7.1 +

from bs4 import BeautifulSoup as bs
import requests

r = requests.get('https://news.ycombinator.com/')
soup = bs(r.content, 'lxml')
top_rows = soup.select('.athing')

for row in top_rows:
    title = row.select_one('.storylink')
    print(title.text)
    print(title['href'])
    print('https://news.ycombinator.com/' + row.select_one('.sitebit a')['href'])
    next_row = row.next_sibling
    print(next_row.select_one('.score').text)
    print(next_row.select_one('.hnuser').text)
    print(next_row.select_one('.age a').text)
    print(next_row.select_one('a:nth-child(6)').text)
    print(100*'-')
1 голос
/ 20 октября 2019

Я не получаю html-тег tbody из Beautifulsoup или скрипта curl. Это означает, что

soup.select('tbody')

возвращает пустой список. Это та же причина для вас, чтобы получить пустой список.

Чтобы просто извлечь ссылки, которые вы ищете, просто сделайте

soup.select("a.storylink")

Он получит ссылкичто вы хотите с сайта.

...