Python и XPath

Soprano

Комбинатор
Регистрация
11 Апр 2009
Сообщения
653
Реакции
975
В C# при получении данных с сайта через XPath делаю так
string sign = "//div[contains(@class, ''sign1")]";
при том что
class=sign1_Uyfgrtdf
в Python это выглядит так
sign = soup.find_all('div', class_='sign1_Uyfgrtdf')

Можно ли и как сделать в Python, чтобы брать часть значения, то есть какой аналог contains ?
 
В Python можно использовать библиотеку BeautifulSoup совместно с библиотекой lxml для работы с XPath. В данном случае можно использовать следующий код:

Python:
import requests
from bs4 import BeautifulSoup
from lxml import html
url = "https://example.com"  # Заменить на нужный URL
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
tree = html.fromstring(str(soup))
sign_xpath = "//div[contains(@class, 'sign1')]"
sign_elements = tree.xpath(sign_xpath)
for sign in sign_elements:
    print(sign.text_content())

Здесь мы используем tree.xpath(sign_xpath) для поиска всех элементов, соответствующих заданному XPath-выражению, которое содержит contains(@class, 'sign1') для поиска частичного совпадения с атрибутом class.
 
можно и без супа это делать

Python:
from lxml import html

html_content = """
<div class="sign1_Uyfgrtdf">Element 1</div>
<div class="sign1_Xyzabcd">Element 2</div>
<div class="sign2_Abcdefgh">Element 3</div>
"""

tree = html.fromstring(html_content)

elements = tree.xpath('//div[contains(@class, "sign1")]')

for element in elements:
    print(element.text)

кож найдет и выведет текст элементов, у которых значение атрибута class содержит "sign1".
 
можно и без супа это делать

Python:
from lxml import html

html_content = """
<div class="sign1_Uyfgrtdf">Element 1</div>
<div class="sign1_Xyzabcd">Element 2</div>
<div class="sign2_Abcdefgh">Element 3</div>
"""

tree = html.fromstring(html_content)

elements = tree.xpath('//div[contains(@class, "sign1")]')

for element in elements:
    print(element.text)

кож найдет и выведет текст элементов, у которых значение атрибута class содержит "sign1".
на заметку

XPath-запрос
Код:
contains(@class, "sign1")
найдёт любой элемент, класс которого содержит подстроку "sign1", что может привести к нежелательным результатам, если в HTML есть другие классы, содержащие "sign1" в составе более длинной строки. Если вам нужны элементы с точным соответствием класса, запрос XPath потребует корректировки
 
Назад
Сверху