获取包含特定tex的xpath to标记

2024-05-19 01:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试查找网页上某些文本的xpath。如果要转到https://www.york.ac.uk/teaching/cws/wws/webpage1.html并尝试获取“EXERCISE”的xpath,它将类似于“html body html table tbody tr td div h4”。如果你进入那个页面,右击“EXERCISE”并检查它,你可以看到代码底部的路径(在chrome中)。你知道吗

我试过很多种方法。都没有达到预期的效果。这是我得到的最接近的结果:

soup = BS(page, 'html.parser')
tags = [{"name":tag.name,"text":tag.text,"attributes":tag.attributes} for tag in soup.find_all()]
s = ''
for t in tags:
    if "EXERCISE" in t['text']:
        s = s + t['name'] + " "
print(s)

一开始我需要得到“html body html table tbody tr td div h4”,但最终对于更复杂的页面,我还需要得到标记属性

谢谢!你知道吗


Tags: textnameindivhtmltagtablebody
3条回答

如果你知道你想要的标签总是有“EXERCISE”的确切文本(没有引号,或者后面不同的大小写,空格等等),那么你可以在确切的文本上使用.find。不过,您也可以使用正则表达式来代替,以防您确实需要检查空格的变化。你知道吗

从那里,您可以利用.parents获得对象祖先的列表,即包含它的元素、包含该元素的元素,依此类推到文档顶部。然后只需提取标签名,反转列表,并将所有内容连接在一起。你知道吗

thetag = soup.find(string="EXERCISE")
parent_tags = [ p.name for p in list(thetag.parents) ]
print('/'.join(parent_tags[::-1]))

输出:

[document]/html/body/hmtl/table/tr/td/div/h4

如果您不想在开始时使用“[document]”,您可以通过多种方式将其取出,例如使用以下行而不是最后两行:

parent_tags = [ p.name for p in list(thetag.parents)[:-1] ]
print('/' + '/'.join(parent_tags[::-1]))

输出:

/html/body/hmtl/table/tr/td/div/h4

CSS选择器:contains(EXERCISE):not(:has(:contains(EXERCISE)))将选择包含字符串“EXERCISE”的最里面的标记。你知道吗

然后我们使用方法find_parents()找到这个标签的所有父项并打印它们的名字:

import requests
from bs4 import BeautifulSoup

url = 'https://www.york.ac.uk/teaching/cws/wws/webpage1.html'

soup = BeautifulSoup(requests.get(url).text, 'html.parser')

t = soup.select_one(':contains(EXERCISE):not(:has(:contains(EXERCISE)))')
# you can use also this:
# t = soup.find(text="EXERCISE").find_parent()    

#lets print the path
tag_names = [t.name, *[t.name for t in t.find_parents()]]
print(' > '.join(tag_names[::-1]))

印刷品:

[document] > hmtl > body > table > tr > td > div > p > p > p > p > h4

使用lxml:

url = 'https://www.york.ac.uk/teaching/cws/wws/webpage1.html'

import requests
from lxml import etree
parser = etree.HTMLParser()
page  = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})

root = etree.fromstring(page.content,parser)

tree = etree.ElementTree(root)
e = root.xpath('.//*[text()="EXERCISE"]')
print(tree.getpath(e[0]))

输出:

/html/body/hmtl/table/tr/td/div[2]/h4

相关问题 更多 >

    热门问题