Python从变量类属性抓取

Python从变量类属性抓取,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我试图从html列表中提取一些HREF,其中一些源代码如下: <ul class="sub-menu"> <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/"&

我试图从html列表中提取一些HREF,其中一些源代码如下:

<ul class="sub-menu">
    <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a></li>
    <li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"><a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a></li>
    <li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"><a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a></li>
    <li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"><a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a></li>
</ul>
但我随后意识到,菜单项对象属性菜单项xxxx的最后一位,即应代替xxxx的数字,对于每个列表项都是不同的

所以我有两个问题:

1) 给定源代码,这是获得HREF的最有效方法吗

2) 如果是,或者仅仅是为了一般知识,当类属性末尾的最后几位数字更改时,我将如何获取它们


很抱歉,如果这是重复的,我似乎无法在上面找到它。

在这种特殊情况下,您可以在使用find\u all时使用regex

例如:

import re
from bs4 import BeautifulSoup

example = """<ul class="sub-menu">
<li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a></li>
<li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"><a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a></li>
<li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"><a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a></li>
<li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"><a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a></li>
</ul>"""

soup = BeautifulSoup(example, "html.parser")

for o in soup.find_all('li', class_=re.compile(r'menu-item menu-item-type-
post_type menu-item-object-properties menu-item-')):
    print (o.a["href"])
重新导入
从bs4导入BeautifulSoup
示例=“”
” soup=BeautifulSoup(例如,“html.parser”) 对于汤中的o.find_all('li',class_=re.compile(r'菜单项菜单项类型- post_类型菜单项对象属性菜单项-'): 打印(o.a[“href”])
输出


在这种特殊情况下,可以在使用find_all时使用正则表达式

例如:

import re
from bs4 import BeautifulSoup

example = """<ul class="sub-menu">
<li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a></li>
<li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"><a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a></li>
<li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"><a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a></li>
<li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"><a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a></li>
</ul>"""

soup = BeautifulSoup(example, "html.parser")

for o in soup.find_all('li', class_=re.compile(r'menu-item menu-item-type-
post_type menu-item-object-properties menu-item-')):
    print (o.a["href"])
重新导入
从bs4导入BeautifulSoup
示例=“”
” soup=BeautifulSoup(例如,“html.parser”) 对于汤中的o.find_all('li',class_=re.compile(r'菜单项菜单项类型- post_类型菜单项对象属性菜单项-'): 打印(o.a[“href”])
输出


我不知道您真正的HTML是否比您在问题中提供的HTML更复杂,但为什么要搞乱类,而不仅仅使用标记元素名称来获得您想要的结果呢

通常,您应该使用一些类名,或者更好的是使用一些ID(它们是唯一的),以便将HTML简化为您感兴趣的真实字段

但真正起神奇作用的代码是:

from bs4 import BeautifulSoup as Soup
html_str = """
<ul class="sub-menu">
    <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019">
        <a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a>
    </li>
    <li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186">
        <a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a>
    </li>
    <li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184">
        <a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a>
    </li>
    <li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544">
        <a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a>
    </li>
</ul>"""
soup = Soup(html_str, 'html.parser')
for ul in soup.find_all('ul'):
    for the_href in ul.find_all('li'):
        print(the_href.a.get('href'))
从bs4导入BeautifulSoup作为汤
html_str=”“”
” soup=soup(html_str,'html.parser') 对于汤中的ul。查找所有('ul'): 对于ul.find_all('li')中的_href: 打印(href.a.get('href'))
我不知道您真正的HTML是否比您在问题中提供的HTML更复杂,但为什么要搞乱类,而不仅仅使用标记元素名称来获得您想要的结果呢

通常,您应该使用一些类名,或者更好的是使用一些ID(它们是唯一的),以便将HTML简化为您感兴趣的真实字段

但真正起神奇作用的代码是:

from bs4 import BeautifulSoup as Soup
html_str = """
<ul class="sub-menu">
    <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019">
        <a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a>
    </li>
    <li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186">
        <a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a>
    </li>
    <li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184">
        <a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a>
    </li>
    <li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544">
        <a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a>
    </li>
</ul>"""
soup = Soup(html_str, 'html.parser')
for ul in soup.find_all('ul'):
    for the_href in ul.find_all('li'):
        print(the_href.a.get('href'))
从bs4导入BeautifulSoup作为汤
html_str=”“”
” soup=soup(html_str,'html.parser') 对于汤中的ul。查找所有('ul'): 对于ul.find_all('li')中的_href: 打印(href.a.get('href'))
谢谢。这是我最初尝试的,但它会从网页上的所有列表中获取所有链接!谢谢。这是我最初尝试的,但它会从网页上的所有列表中获取所有链接!