Получение элемента через L XML по XPATH - PullRequest
1 голос
/ 30 апреля 2020

Я кодирую бота Discord в библиотеке для python, discord.py.

Мне не нужна помощь, но я собираю информацию с сайта.

    @commands.command(aliases=["rubyuserinfo"])
    async def rubyinfo(self, ctx, input):
        HEADERS = {
            'User-Agent' : 'Magic Browser'
        }

        url = f'https://rubyrealms.com/user/{input}/'

        async with aiohttp.request("GET", url, headers=HEADERS) as response:
            if response.status == 200:
                print("Site is working!")
                content = await response.text()
                soup = BeautifulSoup(content, "html.parser")
                page = requests.get(url)
                tree = html.fromstring(page.content)
                stuff = tree.xpath('/html/body/div[4]/div/div[3]/div[3]/div/div[2]/div[1]/div[2]/div/p')
                print(stuff)
            else:
                print(f"The request was invalid\nStatus code: {response.status}")

Веб-сайт, который я ищу, это "https://rubyrealms.com/user/ {input} /", где вводится при выполнении h! Rubyinfo USERNAME, меняя ссылку на https://rubyrealms.com/user/username/.

На сайте я хочу получить их BIO с XPATH

"//*[@id="content-wrap"]/div[3]/div[3]/div/div[2]/div[1]/div[2]/div/p"

, где элемент:

<p class="margin-none font-color">
Hey! My name is KOMKO190, you maybe know me from the forums or discord. I am a programmer, I know a bit of JavaScript, small portion of C++, Python and html/css. Mostly python. My user ID is 7364. ||| 5th owner of Space Helmet :) </p>

Любая помощь в том, как я могу это отменить? Единственный ответ, который дает мой бот: "[]"

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Измените выражение XPath на относительное:

from lxml import html
import requests
page = requests.get('https://www.rubyrealms.com/user/KOMKO190/')
tree = html.fromstring(page.content)
stuff = tree.xpath('normalize-space(//h3[.="Bio"]/following-sibling::p/text())')
print (stuff)

Вывод:

Hey! My name is KOMKO190, you maybe know me from the forums or discord. I am a programmer, I know a bit of JavaScript, small portion of C++, Python and html/css. Mostly python. My user ID is 7364. ||| 5th owner of Space Helmet :)
1 голос
/ 30 апреля 2020

Как насчет следующего, используя метод .select ()

from bs4 import BeautifulSoup

html = '<p class="margin-none font-color">Hey! My name is KOMKO190 :) </p>'

soup = BeautifulSoup(html, features="lxml")
element = soup.select('p.margin-none')[0]
print(element.text)

Распечатывает

Hey! My name is KOMKO190 :) 
0 голосов
/ 30 апреля 2020
from bs4 import BeautifulSoup as bs

url = 'https://rubyrealms.com/user/username/'

session = requests.Session()
request = session.get(url=url)
if request.status_code == 200:
    soup = bs(request.text, 'lxml')
    print(soup.find('p', class_='margin-none font-color').text)
else:
    print(request.status_code)

Вам нужно установить

pip install lxml
pip install beautifulsoup4
...