小编Gra*_*rus的帖子

用汤选择美丽汤中的第二个孩子?选择?

我有:

<h2 id='names'>Names</h2>
<p>John</p>
<p>Peter</p>
Run Code Online (Sandbox Code Playgroud)

如果我已经拥有h2标签,那么现在最简单的方法就是将Peter带到这里?现在我试过了:

soup.select("#names > p:nth-child(1)")
Run Code Online (Sandbox Code Playgroud)

但在这里我得到了nth-child NotImplementedError:

NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type.
Run Code Online (Sandbox Code Playgroud)

所以我不确定这里发生了什么.第二种选择是让所有'p'标记子项和硬选择[1]但是那时存在索引超出范围的危险,这将需要围绕每次尝试以获得彼得的尝试/除了有点愚蠢.

有没有办法用soup.select()函数选择nth-child?

编辑: 用nth-type替换nth-child似乎可以解决问题,所以正确的行是:

soup.select("#names > p:nth-of-type(1)")
Run Code Online (Sandbox Code Playgroud)

不确定为什么它不接受nth-child但似乎nth-child和nth-of-type返回相同的结果.

python beautifulsoup web-scraping

13
推荐指数
2
解决办法
1万
查看次数

Python 诗篇——如何安装可选的依赖项?

Python 的诗歌依赖管理器允许通过命令指定可选的依赖:

$ poetry add --optional redis
Run Code Online (Sandbox Code Playgroud)

这导致此配置:

[tool.poetry.dependencies]
python = "^3.8"
redis = {version="^3.4.1", optional=true}
Run Code Online (Sandbox Code Playgroud)

但是,您如何实际安装它们?文档似乎暗示:

$ poetry install -E redis
Run Code Online (Sandbox Code Playgroud)

但这只是抛出和错误:

Installing dependencies from lock file

[ValueError]
Extra [redis] is not specified.
Run Code Online (Sandbox Code Playgroud)

python python-poetry

13
推荐指数
4
解决办法
5945
查看次数

在scrapy中嵌套项数据的正确方法

嵌套Item数据的正确方法是什么?

例如,我想要一个产品的输出:

{
'price': price,
'title': title,
'meta': {
    'url': url,
    'added_on': added_on
}
Run Code Online (Sandbox Code Playgroud)

我有scrapy.Item:

class ProductItem(scrapy.Item):
    url = scrapy.Field(output_processor=TakeFirst())
    price = scrapy.Field(output_processor=TakeFirst())
    title = scrapy.Field(output_processor=TakeFirst())
    url = scrapy.Field(output_processor=TakeFirst())
    added_on = scrapy.Field(output_processor=TakeFirst())
Run Code Online (Sandbox Code Playgroud)

现在,我这样做只是根据新的项目模板重新格式化管道中的整个项目:

class FormatedItem(scrapy.Item):
    title = scrapy.Field()
    price = scrapy.Field()
    meta = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

并在管道中:

def process_item(self, item, spider):
    formated_item = FormatedItem()
    formated_item['title'] = item['title']
    formated_item['price'] = item['price']
    formated_item['meta'] = {
        'url': item['url'],
        'added_on': item['added_on']
    }
    return formated_item
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?还是有一种更直接的方法来解决这个问题而不违反框架的理念?

scrapy

12
推荐指数
1
解决办法
2934
查看次数

做组合别名的 Pythonic 方式

做组合别名的最pythonic和正确的方法是什么?

这是一个假设的场景:

class House:
    def cleanup(self, arg1, arg2, kwarg1=False):
        # do something

class Person:
    def __init__(self, house): 
        self.house = house
        # aliases house.cleanup
        # 1.
        self.cleanup_house = self.house.cleanup

    # 2.
    def cleanup_house(self, arg1, arg2, kwarg1=False):
        return self.house.cleanup(arg1=arg1, arg2=arg2, kwarg1=kwarg1)

Run Code Online (Sandbox Code Playgroud)

AFAIK 与 #1 我测试的编辑器理解这些和 #2 一样好 - 自动完成、文档字符串等。

#1 方法有什么缺点吗?从python的角度来看,哪种方式更正确?

扩展方法 #1 unsettable 和类型提示的变体将不受评论中指出的所有问题的影响:

class House:

    def cleanup(self, arg1, arg2, kwarg1=False):
        """clean house is nice to live in!"""
        pass


class Person:
    def __init__(self, house: House):
        self._house = house
        # aliases
        self.cleanup_house …
Run Code Online (Sandbox Code Playgroud)

python

8
推荐指数
1
解决办法
216
查看次数

asyncio.gather 中内联链 asyncio 协程

我有一个假设的asyncio.gather场景:

await asyncio.gather(
    cor1,
    [cor2, cor3],
    cor4,
)
Run Code Online (Sandbox Code Playgroud)

我愿意在这里cor2cor3顺序被处决。除了像这样定义外部协程之外,还有其他快捷方式吗:

async def cor2_cor3():
    await cor2
    await cor3

await asyncio.gather(
    cor1,
    cor2_cor3,
    cor4,
)
Run Code Online (Sandbox Code Playgroud)

有没有更干净的捷径?

python python-asyncio

6
推荐指数
1
解决办法
1517
查看次数

为 python 的 Logger 对象设置默认日志记录额外

在内置的 python 日志模块中,您创建一个记录器并记录消息:

\n
import logging\nlog = logging.getLogger('mylogger')\nlog.info('starting!')\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以将附加信息传递给格式化程序稍后将使用的日志消息:

\n
user = 'john doe'\nlog.info('starting!', extra={'user': 'john doe'})\n
Run Code Online (Sandbox Code Playgroud)\n

然而,对每条消息都明确地执行此操作是相当乏味的。是否可以为整个记录器设置额外的内容,以便它们会随每个日志一起传递?

\n

就像是:

\n
log = logging.getLogger('mylogger')\nlog.extras = {'user': 'john doe'}\nlog.info('starting!')\n
Run Code Online (Sandbox Code Playgroud)\n

目前看来唯一的方法是猴子补丁log()方法:

\n
def patch_default_extras(logger, extras):\n    original_log = logger.log\n\n    def log_with_extras(level, msg, *args, **kwargs):\n        kwargs['extra'] = {**extras, **kwargs.get('extra', {})}\n        return original_log(level, msg, *args, **kwargs)\n\n    logger.log = log_with_extras\n\n\nmylog = logging.getLogger('mylogger')\npatch_default_extras(mylog, {'user': 'john doe'})\nmylog = logging.getLogger('mylogger')\nmylog.log(logging.ERROR, 'hello')\n
Run Code Online (Sandbox Code Playgroud)\n

这是相当丑陋的,但除非我错过了一些东西 \xe2\x80\x92 这是唯一的方法?

\n

python logging

6
推荐指数
1
解决办法
5125
查看次数

在 rst 中向图像添加标题属性

在图像选项方面,重构的文本标记似乎非常有限:

可识别以下选项:
alt :文本
height :长度
width :当前行宽度的长度或百分比
scale :整数百分比(“%”符号是可选的)
align :“顶部”、“中间”、“底部”、“ left"、"center" 或 "right"
目标:文本(URI 或引用名称)

是否可以通过 reStructuredText 标记设置一些自定义属性,例如标题?

例如

.. image:: foobar.jpg 
    :title: mouse over text, hi!
Run Code Online (Sandbox Code Playgroud)

会输出:

<img src="foobar.jpg" title="mouse over text, hi!"></img>
Run Code Online (Sandbox Code Playgroud)

restructuredtext pelican

5
推荐指数
1
解决办法
2490
查看次数

为什么内联IF赋值需要else语句?

x = 'foo' if x == 'bar' else x
Run Code Online (Sandbox Code Playgroud)

现在这将等于:

x = 'foo' if x == 'bar' 
Run Code Online (Sandbox Code Playgroud)

但这会返回"无效语法"错误.是否有这样的原因,或者设计决策背后的原因是什么?因为如果函数是多行的(例如#2的函数):

if x == 'foo':
    x = 'bar'
Run Code Online (Sandbox Code Playgroud)

它完美无缺.

python

2
推荐指数
2
解决办法
395
查看次数

使用Scrapy抓取链接到我们想要的任何深度的网站的所有页面

我很想知道是否可以抓取网站上任意深度的所有页面和链接,即使在跟踪几个链接后顶部 URL 发生变化?这是一个例子:

热门网址:www.topURL.com
有 3 个链接:www.topURL.com/link1、www.topURL.com/link2 和 www.topURL.com/link3

然后,如果我们点击 www.topURL.com/link1,它会将我们带到一个页面,该页面本身有
2 个链接:www.topURL.com/link4 和 www.topURL.com/link5

但如果我们点击 www.topURL.com/link4 ,它会将我们带到一个包含以下 2 个链接的页面:www.anotherURL.com/link1 和 www.thirdURL.com/link1

scrapy 或任何 python 爬虫/蜘蛛是否可以从 www.topURL.com 开始,然后跟踪链接并最终到达 www.thirdURL.com/link1?

它的深度有限制吗?有任何代码示例向我展示如何做到这一点吗?

谢谢您的帮助。

web-crawler scrapy web-scraping python-3.x

2
推荐指数
1
解决办法
5565
查看次数

是否可以获取用于创建字典对象的 TypedDict 类的引用?

Python 3.8 引入了TypedDict应该用于输入 dict 对象的类:

from typing import TypedDict
class MyDict(TypedDict):
    name: str

type(MyDict(name='foo'))
# dict
Run Code Online (Sandbox Code Playgroud)

这里的问题是,由其创建的最终对象TypedDict是一个dict类型对象,并且丢失了对原始创建类的任何类型的引用MyDict
换句话说,type(MyDict(name='foo'))应该生成dict对象而不是MyDict对象。

是否可以修补TypedDict此功能?dict或者,也许在生成的对象中我缺少对原始类的引用?

python

2
推荐指数
1
解决办法
3955
查看次数

从样式中提取URL:background-url:是否有beautifulsoup而没有正则表达式?

我有:

<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');"
Run Code Online (Sandbox Code Playgroud)

我想获取网址,但是如果不使用正则表达式,我将无法做到这一点。可能吗?

到目前为止,我使用正则表达式的解决方案是:

url = re.findall('\('(.*?)'\)', soup['style'])[0]
Run Code Online (Sandbox Code Playgroud)

python string beautifulsoup web-scraping

0
推荐指数
1
解决办法
5324
查看次数